2016-10-06 117 views
-1

我有一個字符串數組是這樣的:器陣列與另一所有數組元素 - 爪哇8

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

和我有第二陣列是這樣的:

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

如果我想與一個到流元素,我可以這樣做:

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

我怎麼能流第一個數組與第二個數組在java 8中的所有元素?

+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

你想要做什麼?獲取第一個數組中所有也存在於第二個數組中的元素?

像這樣:

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