2016-12-04 28 views
2

我試圖訪問內部對象而不引起空指針異常。 如果條件null檢查並使用利用java 8功能,我想避免手動編寫。Java 8 stream findFirst throwing NPE,無法過濾掉流中的非空對象

我正在從findFirst方法獲取Nullpointer異常。我知道,findFirst返回空指針異常,如果選定的元素爲空,所以我試圖在調用findFirst之前使用過濾器(對象:: nonNull)過濾掉空對象,但它仍然拋出空指針。

看起來像我的過濾不起作用,但我不知道爲什麼。

Please find below the code 

package main.java; 

import java.util.*; 
import java.util.stream.Stream; 


public class OptionalTest { 

    public static void main(String args[]) { 
     Inner in = new Inner("Has Value"); 
     Nested nest = new Nested(in); 
     List<Nested> list = new ArrayList<Nested>(); 
     //list.add(nest); //commented out to test failure scenario 
     list.add(null); //added null 
     list.add(null); //added null 
     Outer outer = new Outer(list); 
     OuterMost outermost = new OuterMost(outer); 

     Optional<String> innerValue = Optional.ofNullable(outermost) // outermost var can be null, hence using Optional.ofNullable 
       .map(OuterMost::getOuter) 
       .map(Outer::getNested) 
       .map(Collection::stream) 
       .filter(Objects::nonNull) //findFirst throws null pointer if selected element is null, hence filtering out null 
       .flatMap(Stream::findFirst) 
       .map(Nested::getInner) 
       .map(Inner::getFoo); 


     System.out.println(innerValue.orElse("No Value")); 
    } 
} 

//Classes OuterMost>Outer>Nested(List)>Inner 

class OuterMost { 
    public OuterMost(Outer out) { 
     outer = out; 
    } 

    Outer outer; 

    Outer getOuter() { 
     return outer; 
    } 
} 

class Outer { 
    public Outer(List<Nested> nest) { 
     nested = nest; 
    } 

    List<Nested> nested; 

    List<Nested> getNested() { 
     return nested; 
    } 
} 

class Nested { 

    public Nested(Inner in) { 
     inner = in; 
    } 

    Inner inner; 

    Inner getInner() { 
     return inner; 
    } 
} 

class Inner { 
    public Inner(String val) { 
     foo = val; 
    } 

    String foo; 

    String getFoo() { 
     return foo; 
    } 
} 
+0

你需要收集結果 –

回答

3

你打電話,而不是調用它的Stream<Nested>Optional<Stream<Nested>>過濾器()。

使用

Optional<String> innerValue = Optional.ofNullable(outermost) // outermost var can be null, hence using Optional.ofNullable 
      .map(OuterMost::getOuter) 
      .map(Outer::getNested) 
      .map(nestedList -> nestedList.stream().filter(Objects::nonNull)) 
      .flatMap(Stream::findFirst) 
      .map(Nested::getInner) 
      .map(Inner::getFoo);