mulitple可选参数,Java 8是Optional <List <Object >> vs List <Optional <Object >>

时间:2019-07-03 02:22:31

标签: list java-8 optional

我是新手,我想进一步了解如何必须使用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>> 有什么区别(我必须考虑的注意事项)?

1 个答案:

答案 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)。同样,如果不存在该值,则可能不应该首先将其添加到列表中。