2017-11-20 19 views
1

streamを使用してfirstNameとlastNameでFriendを検索しようとしています。このストリームからオブジェクトを返すことは可能ですか?その名前と姓の友達のように?今やリターンはミスマッチです。ストリームからオブジェクトを取得する

@Override 
public Friend findFriend(String firstName, String lastName) throws FriendNotFoundException { 
    if (firstName == null || lastName ==null) { 
     throw new IllegalArgumentException("There is no parameters"); 
    } 

      List<Friend> result = friends.stream() 
      .filter(x -> (firstName.equals(x.getFirstName())) && 
      (lastName.equals(x.getLastName())))) 
      .collect(Collectors.toList()); 

      return result; 
+2

'collect()'ではなく 'findAny()'または 'findFirst()'を呼び出します。 – shmosel

答えて

2

そうのようなfindFirstを利用:

return friends.stream() 
       .filter(x -> firstName.equals(x.getFirstName()) && 
          lastName.equals(x.getLastName()) 
        ) 
       .findFirst().orElse(null); 

またはOptional<Friend>すなわち返す:

@Override 
public Optional<Friend> findFriend(String firstName, String lastName) throws FriendNotFoundException { 
     if (firstName == null || lastName == null) { 
      throw new IllegalArgumentException("There is no parameters"); 
     } 

     return friends.stream() 
       .filter(x -> firstName.equals(x.getFirstName()) && 
          lastName.equals(x.getLastName()) 
        ) 
       .findFirst(); 
} 

、あなたがオーバーライドしている方法もOptional<Friend>を返すように宣言されなければならないことを意味するとし、必要に応じて継承階層を上げます。

+0

それは働いた!ありがとう! – Donne

+0

オプションのニースヒント。しかし、あなたは 'findAny()'を使いたいかもしれません。大きなストリームの方が効率的かもしれません。 –

+0

@MalteHartwig trueの場合、 'findAny'は' findAny'を使用するのではなく 'findAny'を使う制約が少ないので、parallelStreamで一括操作を行うときに' findAny'を使うことをお勧めします。 –

関連する問題