2017-01-20 5 views
4

私は現在以下のコードを持っています。Java 8ストリーム - フラットマップ後の元のストリームオブジェクトを参照

方法 - parseGreeting()

public GetGreetingNmsObjects parseGreeting(String greetingType, GetGreetingNmsResponse xmlFromNms) { 

    GetGreetingNmsObjects objectFound = null; 
    List<GetGreetingNmsObjects> objList = xmlFromNms.getObject(); 
    for (GetGreetingNmsObjects obj : objList) { 

     List<Attribute> attrs = obj.getAttributes(); 
     Optional<Boolean> found = attrs.stream() 
           .filter(a -> a.name.equals(GREETING_TYPE)) 
           .map(a -> a.value.equals(greetingType)) 
           .findAny(); 

     if(found.get()) { 
      objectFound = obj; 
      break; 
     } 

    return objectFound; 
} 

GetGreetingNmsObjects上記方法において

public class GetGreetingNmsObjects { 
    List<Attribute> attributeList; 

    public List<Attribute> getAttributes() { 
     return attributeList; 
    } 
} 

の.java、forループとif文を回避する方法がありますストリーム自体で対処しますか?

'flatmap'を使用して 'attributesList'のストリームを取得しようとしましたが、一致が見つかると、 'GetGreetingNmsObjects'オブジェクトへの参照を取得できませんでした。

GetGreetingNmsObjects objectFound = objList.stream() 
            .flatMap(grt -> grt.getAttributes()) 
            .filter(a -> a.name.equals(GREETING_TYPE)) 
            .map(a -> a.value.equals(greetingType)) 
            ???? 

答えて

11

あなたの元のコードは、論理エラーが含まれています

Optional<Boolean> found = … 
         .map(a -> a.value.equals(greetingType)) 
         .findAny(); 

これは、任意の比較の結果を返します、シーケンシャル文脈では、それはおそらく最初の要素の結果です。

私はあなたが実際に一致する要素があるかどうかを知りたいことをかなり確信している、したがって、

boolean found = … 
       .anyMatch(a -> a.value.equals(greetingType)); 

を使用する必要があります。これは単純にマッチング要素を持つ最初の要素を見つけるために、述語として使用することができます。

return xmlFromNms.getObject().stream() 
    .filter(obj -> obj.getAttributes().stream() 
         .filter( a -> a.name.equals(GREETING_TYPE)) 
         .anyMatch(a -> a.value.equals(greetingType))) 
    .findFirst().orElse(null); 
関連する問題