2016-04-12 5 views
1

Почему у меня есть следующее исключение?Поток уже оперирован или закрыт - Java 8

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed 
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)... 

com.search.offer.OffersSelector.isGood (OffersSelector.java:23) Как изменить код, чтобы исправить это?

Stream<String> titleExclusions = ResourceUtility.contentToUtf8TreeSet("+.txt"). 
     stream().filter(item -> item.length() == 0).collect(Collectors.toSet()).stream(); 
//... 
titleExclusions.filter(tittle::contains).collect(Collectors.toSet()).size() == 0;//line 23 
+5

Пожалуйста, сделайте [mcve]. Ваш код не компилируется. – Tunaki

+3

Вы не можете управлять потоком дважды. Предположительно, вы уже работали над 'titleExclusions' в' // ... '. –

+1

Кстати, вам не нужно собирать в 'Set' все время (в противном случае, если вы хотите сделать свою работу с' Set ', просто сделайте это, не переключаясь на Interface Stream между ними). Так как ваши элементы уже выделены, 'collect (Collectors.toSet()). Size()' точно так же, как 'count()', но 'stream.filter (tittle :: contains) .collect (Collectors.toSet ()). size() == 0' - это то же самое, что просто 'stream.noneMatch (tittle :: contains)' anyway ... – Holger

ответ

5

Вы не можете работать с Streams более одного раза, поэтому вам лучше использовать Коллекции, поскольку они могут использоваться более одного раза.

Set<String> titleExclusions = ResourceUtility.contentToUtf8TreeSet("+.txt") 
              .stream() 
              .filter(item -> !item.isEmpty()) 
              .collect(Collectors.toSet()); 
// uses titleExclusions 
boolean noMatches = titleExclusions.stream() 
            .noneMatch(tittle::contains); 
// uses titleExclusions again. 

Примечание: Я предполагаю, что вам нужны непустые строки из исходного файла вместо наборов пустых. filter принимает Predicate того, что сохраняется, а не отбрасывается.

Благодарим @Holger за упрощение второго утверждения.

+1

'.filter (tittle :: contains) .findAny(). IsPresent()' действительно 'anyMatch (tittle :: contains)' – Tunaki

+4

@Tunaki: ... и '! (TitleExclusions.stream(). Filter (tittle ::) .findAny() .isPresent()) 'такое же, как' titleExclusions.stream(). noneMatch (tittle :: contains) '. – Holger