Java 8 流。除其他元素之外的所有元素

2022-09-01 18:45:09

我感兴趣的是确定一种方法,该方法返回一个元素列表,不包括另一个列表中的元素。

例如

List<Integer> multiplesOfThree = ... // 3,6,9,12 etc
List<Integer> evens = ... // 2,4,6,8 etc
List<Integer> others = multiplesOfThree.except(evens) // should return a list of elements that are not in the other list

你是怎么做到的?我发现了一种有点笨拙且难以阅读的方法....

multiplesOfThree.stream()
.filter(intval -> evens.stream().noneMatch(even -> even.intValue() == intval.intValue()))

答案 1

可以使用 Streamfilter 方法,传递 一个,以确保 元素在 中不存在。Predicateevens

List<Integer> others = multiplesOfThree.stream()
        .filter(i -> !evens.contains(i))
        .collect(Collectors.toList());

但是假设你有一个可变的(例如),你甚至不需要流,只需要集合的 removeAll 方法ListArrayList

multiplesOfThree.removeAll(evens);

答案 2

您可以使用

multipleOfThree.stream()
               .filter(((Predicate<Integer>) evens::contains).negate())

或对于大型列表更有效even

HashSet<Integer> evenSet = new HashSet<>(even);
multipleOfThree.stream()
               .filter(((Predicate<Integer>) evenSet::contains).negate())

推荐