Я пытаюсь найти самый быстрый способ и менее сложный способ выполнить некоторые операции union/exclude/intersection над потоками Java SE 8.Операции между потоками java
Я делаю это:
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"]
я получаю следующее исключение:
java.lang.IllegalStateException: поток уже оперированных или закрыт
Если я был в состоянии сделать эту операцию, я мог бы развить себе все остальное, объединение, пересечение и т. д.
Итак, 2 балла:
1) Что я делаю неправильно в этом решении, чтобы получить это Исключение?
2) Существует ли менее сложный способ выполнения операций между двумя потоками?
Примечание
Я хочу использовать потоки, чтобы узнать о них. Не хотите преобразовывать их в массивы или списки
«Не хотите превращать их в массивы или списки» Возможно, вам этого не захочется, но другого решения не будет, кроме хранения одного потока в коллекции. –
Вы понимаете, что varargs неявно создает массив для вас, не так ли? – shmosel
Если вы хотите игнорировать тот факт, что 'Stream.of' создает массив за кулисами, вы * можете * просто использовать' fruitStream.filter ( элемент ->! Stream.of («orange», «kiwi», «melon», «apple», «арбуз»). anyMatch (item2 -> item2.equals (item))) ... ', но, конечно, решение на основе HashSet более эффективно. – Holger