过滤数组与另一个所有数组元素 - Java 8

时间:2016-10-06 14:46:03

标签: java java-8 java-stream

我有一个像这样的字符串数组:

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 个答案:

答案 0 :(得分:3)

如果您想使用Stream API仅保留第二个数组中没有的第一个数组的元素,您可以这样做:

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

答案 1 :(得分: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。从功能编程的角度来看,这更纯粹。

编辑 - 借助Holger的提示(请参阅下面的评论):

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