Java8流。除其他元素外的所有元素
我感兴趣的是确定一种方法,它返回一个元素列表,不包括另一个列表中的元素 比如说Java8流。除其他元素外的所有元素,java,java-8,java-stream,Java,Java 8,Java Stream,我感兴趣的是确定一种方法,它返回一个元素列表,不包括另一个列表中的元素 比如说 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
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
您可以使用,传递一个谓词
,以确保元素不存在于evens
中
List<Integer> others = multiplesOfThree.stream()
.filter(i -> !evens.contains(i))
.collect(Collectors.toList());
你可以用
multipleOfThree.stream()
.filter(((Predicate<Integer>) evens::contains).negate())
有几种解决办法 首先,不使用流,您只需创建一个新列表并从中删除另一个集合中的所有元素
final List<Integer> multiplesOfThree = Arrays.asList(3,6,9,12);
final List<Integer> evens = Arrays.asList(2,4,6,8,10,12);
final List<Integer> others1 = new ArrayList<>(multiplesOfThree);
others1.removeAll(evens);
removeAll是一个优秀的解决方案。
multipleOfThree.stream()
.filter(((Predicate<Integer>) evens::contains).negate())
HashSet<Integer> evenSet = new HashSet<>(even);
multipleOfThree.stream()
.filter(((Predicate<Integer>) evenSet::contains).negate())
final List<Integer> multiplesOfThree = Arrays.asList(3,6,9,12);
final List<Integer> evens = Arrays.asList(2,4,6,8,10,12);
final List<Integer> others1 = new ArrayList<>(multiplesOfThree);
others1.removeAll(evens);
final List<Integer> others2 = multiplesOfThree
.stream()
.filter(x -> !evens.contains(x))
.collect(Collectors.toList());
final List<Integer> others3 = multiplesOfThree
.stream()
.filter(x -> x % 2 != 0)
.collect(Collectors.toList());