Java 8 可选<;T>;不处理空元素

Java 8 可选<;T>;不处理空元素,java-8,java-stream,Java 8,Java Stream,正如我实验的那样,Optional不处理null元素,因此在下面的示例中,它在最后一条语句中抛出一个NullPointerException: List<String> data = Arrays.asList("Foo", null, "Bar"); data.stream().findFirst().ifPresent(System.out::println); data.stream().skip(1).findFirst().ifPresent(System.out::pri

正如我实验的那样,
Optional
不处理
null
元素,因此在下面的示例中,它在最后一条语句中抛出一个
NullPointerException

List<String> data = Arrays.asList("Foo", null, "Bar");
data.stream().findFirst().ifPresent(System.out::println);
data.stream().skip(1).findFirst().ifPresent(System.out::println);
有没有其他方法可以避免将null显式处理为:
item!=null

您可以使用为此目的添加的方法使用
.filter(Objects::nonNull)

没有办法避免显式筛选,除非您首先避免源列表中出现
null
s

请注意,如果在本例中,
Optional
处理了
null
,这将很奇怪,因为它将生成一个空的可选项,其语义为“没有第一个元素”,这意味着“流是空的”,这是错误的

在这里,显式处理
null
s是最干净的解决方案,因为它还允许您显式地告诉您是否需要
.filter(Objects::nonNull).skip(1)
.skip(1).filter(Objects::nonNull)


…或
.map(s->s==null?“null替换”:s).findFirst()

这取决于您想做什么。如果要将
null
视为有效值,则答案与跳过null不同

如果要在流中保留“null”:

    List<String> data = Arrays.asList("Foo", null, "Bar");
    data.stream().map(Optional::ofNullable).findFirst().flatMap(Function.identity()).ifPresent(System.out::println);  ;
    data.stream().map(Optional::ofNullable).skip(1).findFirst().flatMap(Function.identity()).ifPresent(System.out::println);
List data=Arrays.asList(“Foo”,null,“Bar”);
data.stream().map(可选::of nullable).findFirst().flatMap(Function.identity()).ifPresent(System.out::println);
data.stream().map(可选::of nullable).skip(1).findFirst().flatMap(Function.identity()).ifPresent(System.out::println);

如果要从流中删除空值,请使用
data.stream().filter(Objects::nonNull)
将其过滤掉(或者如您所述,
o->o!=null
,随您的喜好而定。

避免在列表中存储null?我记不起有哪一个用例我认为这是一个好主意。带有identity
函数的
flatMap
就是我所使用的技巧missing@MiguelGamboa,则
flatMap
基本上将其从可选
取消为一个
可选
,这正是您当时真正想要的。
    List<String> data = Arrays.asList("Foo", null, "Bar");
    data.stream().map(Optional::ofNullable).findFirst().flatMap(Function.identity()).ifPresent(System.out::println);  ;
    data.stream().map(Optional::ofNullable).skip(1).findFirst().flatMap(Function.identity()).ifPresent(System.out::println);