2016-10-06 14 views
-1

は、私はこのような文字列の配列があります。フィルタアレイのJava 8

firstArray = {"1", "2", "3", "4" }; 

をし、私はこのような二番目の配列があります:私は1つでストリーミングする場合

secondArray = {"2", "5", "6", "7" }; 

を要素の場合、私はこのようにすることができます:

firstArray.stream() 
    .filter(element -> !element.equals("2")) 
    .forEach((element) -> { 
     finalArrayList.add(element); 
    } 
); 

私はどのように最初の配列をJava 8のすべての要素で2番目の配列にストリームできますか?

+2

使用静的 'Stream.concat(ストリーム、ストリーム)' https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream:あなたはこのようにそれを行うことができます.html#concat-java.util.stream.Stream-java.util.stream.Stream- – Zircon

+1

I d質問を理解していない。あなたは何を達成したいですか?ここで期待される結果は何ですか? – Tunaki

答えて

0

あなたがStream APIを使用して二番目の配列ではありません最初の配列の要素だけを保持したい場合は、

List<String> result = Arrays.stream(firstArray) 
    .filter(el -> Arrays.stream(secondArray).noneMatch(el::equals)) 
    .collect(Collectors.toList()); 
0

正確に何をしますか? 2番目の配列にも存在する、最初の配列内のすべての要素を取得しますか?このよう

次のユーティリティメソッドを使用

String[] firstArray = {"1", "2", "3", "4"}; 
String[] secondArray = {"2", "5", "6", "7"}; 

List<String> finalArrayList = Arrays.stream(firstArray) 
     .filter(element -> arrayContains(secondArray, element)) 
     .collect(Collectors.toList()); 

public static <T> boolean arrayContains(T[] array, T element) { 
    return Arrays.stream(array) 
       .filter(e -> e.equals(element)) 
       .findFirst().isPresent(); 
} 

注:代わりforEachを使用し、finalArrayListに結果を追加する、コレクタを使用します。それは、関数プログラミングの観点から、より純粋です。

編集 - ホルガーのヒントを(以下、彼のコメントを参照してください):

public static <T> boolean arrayContains(T[] array, T element) { 
    return Arrays.stream(array) 
       .anyMatch(e -> e.equals(element)); 
} 
+0

'filter(predicate).findFirst()。isPresent()'を優先する 'anyMatch(predicate)'の存在を気にしてください。さらに、一致の有無だけに興味があるなら、 'findAny()'は 'findFirst()'よりも適切でしょう。 – Holger