多个可选参数,Optional<List<Object>> vs List<Optional<Object>>, Java 8
mulitple Optional parameters, Optional<List<Object>> vs List<Optional<Object>>, Java 8
我是新手,我想了解更多 如何使用 Optional?
public class UsingOptional {
public static void main(String... args) {
multipleOptional(null, null);
}
public static void multipleOptional(Optional<String> string1, Optional<Integer> string2) {
string1.ifPresent(s -> System.out.println("string1:" + s));
string2.ifPresent(s -> System.out.println("string2:" + s));
}
}
为什么我不能这样做 multipleOptional(null, null);
?
multipleOptional
方法的正确调用方式是什么?
Optional<List<String>>
和List<Optional<String>>
有什么区别(我必须考虑的因素) ?
首先,重要的是要认识到拥有可选变量的全部意义在于避免出现空值,因此必须检查空值。毕竟,如果每次使用时都必须检查一个 Optional 变量是否为 null,那么它就毫无意义 having/using 首先是 Optional。
换句话说,Optional 变量永远不应该为 null - 即,它永远不应该被初始化为 null,永远不应该被分配 null 的值,并且 any/all 方法 return Optional 的值永远不应 return null。在所有这些情况下,应该使用 Optional.empty() 代替。
因此,通过遵守此合同,Optional 强制您始终显式处理数据不存在的情况,而不必担心 NullPointerExceptions。
如果您已经习惯了 Optionals,那么我建议您不要使用字符串,而是创建您自己的 类(Optional<Employee>
等),并使用“吸气剂”来抛出 NPE,如果称为空。根据您的示例,使用字符串很容易不调用它们的方法,因此不会经历促使引入 Optional 的痛苦。
Why I can't to do this multipleOptional(null, null); ?
当然语言允许你这样做,虽然它打破了我刚才所说的关于 Optional 的隐含契约。违反此合同的直接结果是您将在 ifPresent
调用中收到 NullPointerException。
What are the correct ways to call multipleOptional method?
通过使用“可选”! Optionals 的两个最常见来源(除了您自己的代码)是流和数据库访问,其中单个结果被 returned(但库不能假设实际上会有结果)。例如,您的代码可以按如下方式调用:
Optional<String> name1 = employees.stream().filter(e -> e.getOffice() == 1234).findFirst().map(Employee::getName);
Optional<String> name2 = nameRepository.findById(1234);
multipleOptional(name1, name2);
请注意即使没有找到员工或姓名,此代码也能正常工作。
What is the difference (considerations that I must take into account) between Optional<List<String>>
and List<Optional<String>>
?
就我个人而言,我认为两者都毫无意义。如上所述,在检索可能存在或可能不存在的单个结果时,通常使用可选项。因此,它们通常不与列表一起使用 - 毕竟,如果结果不存在,那么您就不会将其包含在列表中(例如,如果查询编码为 return a对象列表恰好 return 零行,那么你只会得到一个空列表 - 无需担心 Optionals)。
因此,我认为我以前从未见过 Optional<List<>>
- 同样,空列表无法很好地处理任何结果。
同样,第二个应该是你有一个字符串列表的地方,其中每个字符串可能存在也可能不存在(或者在没有可选的情况下为空)。同样,如果该值不存在,那么它可能一开始就不应该添加到列表中。
我是新手,我想了解更多 如何使用 Optional?
public class UsingOptional {
public static void main(String... args) {
multipleOptional(null, null);
}
public static void multipleOptional(Optional<String> string1, Optional<Integer> string2) {
string1.ifPresent(s -> System.out.println("string1:" + s));
string2.ifPresent(s -> System.out.println("string2:" + s));
}
}
为什么我不能这样做 multipleOptional(null, null);
?
multipleOptional
方法的正确调用方式是什么?
Optional<List<String>>
和List<Optional<String>>
有什么区别(我必须考虑的因素) ?
首先,重要的是要认识到拥有可选变量的全部意义在于避免出现空值,因此必须检查空值。毕竟,如果每次使用时都必须检查一个 Optional 变量是否为 null,那么它就毫无意义 having/using 首先是 Optional。
换句话说,Optional 变量永远不应该为 null - 即,它永远不应该被初始化为 null,永远不应该被分配 null 的值,并且 any/all 方法 return Optional 的值永远不应 return null。在所有这些情况下,应该使用 Optional.empty() 代替。
因此,通过遵守此合同,Optional 强制您始终显式处理数据不存在的情况,而不必担心 NullPointerExceptions。
如果您已经习惯了 Optionals,那么我建议您不要使用字符串,而是创建您自己的 类(Optional<Employee>
等),并使用“吸气剂”来抛出 NPE,如果称为空。根据您的示例,使用字符串很容易不调用它们的方法,因此不会经历促使引入 Optional 的痛苦。
Why I can't to do this multipleOptional(null, null); ?
当然语言允许你这样做,虽然它打破了我刚才所说的关于 Optional 的隐含契约。违反此合同的直接结果是您将在 ifPresent
调用中收到 NullPointerException。
What are the correct ways to call multipleOptional method?
通过使用“可选”! Optionals 的两个最常见来源(除了您自己的代码)是流和数据库访问,其中单个结果被 returned(但库不能假设实际上会有结果)。例如,您的代码可以按如下方式调用:
Optional<String> name1 = employees.stream().filter(e -> e.getOffice() == 1234).findFirst().map(Employee::getName);
Optional<String> name2 = nameRepository.findById(1234);
multipleOptional(name1, name2);
请注意即使没有找到员工或姓名,此代码也能正常工作。
What is the difference (considerations that I must take into account) between
Optional<List<String>>
andList<Optional<String>>
?
就我个人而言,我认为两者都毫无意义。如上所述,在检索可能存在或可能不存在的单个结果时,通常使用可选项。因此,它们通常不与列表一起使用 - 毕竟,如果结果不存在,那么您就不会将其包含在列表中(例如,如果查询编码为 return a对象列表恰好 return 零行,那么你只会得到一个空列表 - 无需担心 Optionals)。
因此,我认为我以前从未见过 Optional<List<>>
- 同样,空列表无法很好地处理任何结果。
同样,第二个应该是你有一个字符串列表的地方,其中每个字符串可能存在也可能不存在(或者在没有可选的情况下为空)。同样,如果该值不存在,那么它可能一开始就不应该添加到列表中。