java Streams之间的操作

May*_*day 4 java java-8 java-stream

我试图找到最快的方法,而不是通过Java SE 8 Streams进行联合/排除/交叉操作的复杂方法.

我这样做:

Stream<String> fruitStream = Stream.of("apple", "banana", "pear", "kiwi", "orange");
Stream<String> fruitStream2 = Stream.of("orange", "kiwi", "melon", "apple", "watermelon");

//Trying to create exclude operation
fruitStream.filter(
    item -> !fruitStream2.anyMatch(item2 -> item2.equals(item)))
.forEach(System.out::println);
// Expected result: fruitStream - fruitStream2: ["banana","pear"]
Run Code Online (Sandbox Code Playgroud)

我得到以下例外:

java.lang.IllegalStateException:stream已经被操作或关闭

如果我能够做这个操作,我可以开发自己所有其余的,联合,交集等...

所以,2分是:

1)我在这个解决方案中做错了什么?

2)是否有一种不太复杂的方式在两个流之间执行操作?

注意

我想用流来学习它们.不想将它们转换为数组或列表

bra*_*mus 6

第一次item -> !fruitStream2.anyMatch(item2 -> item2.equals(item))执行,它消耗fruitStream2.fruitStream2不能再次使用来过滤第二项fruitStream1.

而不是使用第二个流,为什么不创建Set和使用contains

Set<String> otherFruits = new HashSet<>(); // Add the fruits.
fruitStream.filter(f -> !otherFruits.contains(f)).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

  • 或者`Set &lt;String&gt; otherFruits = Stream.of(“ orange”,“ kiwi”,“ melon”,“ apple”,“ watermelon”)。collect(Collectors.toSet());`更加接近问题的代码。 (2认同)