Для потоковых объектов нельзя ли использовать метод collect для записи пользовательского объекта Collector, который будет собираться в другой потоковый объект? Я только недавно узнал о потоках и пытаюсь получить от них как можно больше опыта, и столкнулся с этой проблемой.
Мой код:
// method to return how many unique letters are used in
// the Strings in the given stream
public int uniqueLetters(Stream<String> stream){
// transfer Strings to an uppercase char stream
IntStream allLets = stream.collect(IntStream::empty,
(s1, s2) -> { String toAdd = s2.toUpperCase();
IntStream cs = toAdd.chars();
IntStream.concat(s1, cs); //exception thrown on this line
}, IntStream::concat);
// use distinct on char stream and count
return (int) allLets.distinct().count();
}
Этот код компилируется, и метод collect работает нормально для первой строки в потоке, но во второй раз, когда он достигает IntStream.concat (s1, cs), я получаю следующее исключение:
java.lang.IllegalStateException: поток уже был обработан или закрыт
Я интерпретирую это так, как только моя первая строка преобразуется в IntStream, а метод collect переходит к следующей строке, мой первый IntStream закрывается. Это верно? Почему это происходит?
Это было упражнение, которое я придумал для себя, чтобы попытаться получить больше опыта с потоками и функциональным программированием. Я знаю, что это, вероятно, не лучший способ написать этот метод. Мне интересно знать, почему это не работает, а не какой другой подход я бы выбрал.