我是新手,我想进一步了解如何必须使用Optional ?
override fun supportFragmentInjector(): AndroidInjector<Fragment> {
return fragmentDispatchingAndroidInjector
}
@Inject
lateinit var fragmentDispatchingAndroidInjector:DispatchingAndroidInjector<Fragment>
}
为什么我不能这样做 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>>
有什么区别(我必须考虑的注意事项)?
答案 0 :(得分:0)
首先,重要的是要认识到拥有Optional变量的全部目的就是要避免拥有null,因此必须检查null。毕竟,如果每次使用Optional变量时都必须检查是否为null,那么首先使用Optional就毫无意义。
换句话说,一个Optional变量绝不能为null-即,它绝不能初始化为null,永远不要被赋值为null,并且任何/所有返回Optional值的方法都绝不能返回null。 。在所有这些情况下,应改用Optional.empty()。
因此,通过遵守此合同,Optional会强制您始终明确处理不存在数据的情况,而不必担心NullPointerExceptions。
如果您习惯使用Optionals,那么我建议您不要使用Strings,而是使用“ getters”创建自己的类(Optional<Employee>
等),如果调用null会抛出NPE。根据您的示例,使用String太容易了,无法在其上调用方法,因此不会遇到促使引入Optional的痛苦。
为什么我不能这样做multipleOptional(null,null); ?
当然,该语言允许您执行此操作,尽管它打破了我刚才在上面关于Optional所说的隐式约定。违反该合同的直接结果是,您在ifPresent
调用中收到NullPointerException。
调用multipleOptional方法的正确方法是什么?
使用“可选”! Optionals的两个最常见的来源(不是您自己的代码)是Streams和数据库访问,在其中返回单个结果(但是库无法假定实际上会出现结果)。例如,您的代码可以如下调用:
Optional<String> name1 = employees.stream().filter(e -> e.getOffice() == 1234).findFirst().map(Employee::getName);
Optional<String> name2 = nameRepository.findById(1234);
multipleOptional(name1, name2);
请注意,即使没有找到员工也没有名字,此代码将如何正常工作。
Optional<List<String>>
和List<Optional<String>>
之间有什么区别(我必须考虑的注意事项)?
就个人而言,我认为两者都毫无意义。如上所述,在检索可能存在或可能不存在的单个结果时,通常使用可选选项。因此,它们通常不与列表一起使用-毕竟,如果不存在结果,那么您就不会在列表中使用它(例如,如果发生了编码为返回对象列表的查询,返回零行,那么您将得到一个空列表-无需担心Optionals。
正因为如此,我认为我以前从未见过Optional<List<>>
-再次,空列表不能很好地处理结果。
同样,第二个应该是您有一个字符串列表,其中每个字符串可能存在或可能不存在(或者为null,不带Optionals)。同样,如果不存在该值,则可能不应该首先将其添加到列表中。