Я экспериментирую с потоками Java и пытаюсь выяснить, что возможно, а также их сильные и слабые стороны. В настоящее время я пытаюсь реализовать Сито Эратосфена с использованием потока, но, похоже, не может найти хороший способ перебрать ранее отфильтрованные значения, не сохраняя их в отдельной коллекции.Java Streams - Фильтрация ранее отфильтрованных значений
Я хотел сделать что-то вроде этого:
IntStream myStream = IntStream.range(0,3);
myStream.filter(s -> {
System.out.print("[filtering "+s+"] ");
myStream.forEach(q -> System.out.print(q+", "));
System.out.println();
return true; //eventually respond to values observed on the line above
});
С желаемым выходом:
[filtering 0]
[filtering 1] 0,
[filtering 2] 0, 1,
[filtering 3] 0, 1, 2,
Обратите внимание, что при фильтрации каждого нового значения наблюдаются все ранее отфильтрованные значения. Это позволило бы легко реализовать Сито Эратосфена, потому что я мог бы фильтровать все непервичные значения и для каждой новой проверки значения для делимости по всем числам, которые ранее передавали первичный фильтр.
Однако приведенный выше пример дает мне ошибку в NetBeans:
local variables referenced from a lambda expression must be final or effectively final
Это, кажется, потому что я ссылки myStream в фильтр, который уже действует на myStream. Есть ли хороший способ обойти эту ошибку (т. Е. Сделать окончательную копию потока, содержащего только те значения, которые были отфильтрованы до сих пор), или есть лучший подход к этой проблеме без использования отдельной коллекции для хранения значения?
Нет, нет лучшего подхода, чем использование отдельной коллекции. Stream API не предназначен для такого использования. –
С кодом, который у вас есть, вы можете поставить ключевое слово 'final' перед' IntStream myStream'. Но код все равно не будет правильным, потому что вам нужно изменить вторую строку на 'myStream = myStream.filter (...)', иначе вы бы использовали поток без фильтрации. –
http: // stackoverflow.com/a/20007272/2711488 вторая половина ... – Holger