如何使用Stream API返回null?

Rom*_*kyi 4 java lambda optional java-8 java-stream

所以,我有一个ArrayList自动生成的字符串.我想找到包含某个字符的第一个元素,否则如果没有一个元素与此过滤器匹配,则应用另一个过滤器.换句话说,我想要返回null对象.

所以我写了这个lambda表达式:

str.stream()
   .filter(s -> s.contains("q"))
   .findFirst()
   .orElseGet(() -> str.stream()
                       .filter(s -> s.contains("w"))
                       .findFirst()
                       .orElseGet(null))
Run Code Online (Sandbox Code Playgroud)

但如果没有一个元素匹配这两个过滤器,我将有NullPointerException.怎么样,我能得到类似的东西:return null

Eug*_*ene 6

除非我遗漏了一些显而易见的东西,否则只是.orElse(null)代替最后一个orElseGet.orElseGet接受一个Supplier你传递一个null,调用get()一个空引用,好吧......


ern*_*t_k 5

另一种更简单的方法:您可以过滤包含qor的字符串w,然后排序以移动包含q第一个的字符串,首先查找,如果可选为空则返回 null:

str.stream()
    .filter(s -> s.contains("q") || s.contains("w"))
    .sorted((s1, s2) -> s1.contains("q") ? -1 : 1 )
    .findFirst()
    .orElse(null);
Run Code Online (Sandbox Code Playgroud)

.sorted((s1, s2) -> s1.contains("q") ? -1 : 1 )将移动包含第一个的字符串"q"q由于流仅根据包含或 的值进行过滤w,因此返回 null 只会发生不保留任何元素的情况。