2016-04-12 35 views
1

Neden bir sonraki özel durumum var? bunu düzeltmek için kodunu değiştirmek nasılAkış halihazırda çalışmış veya kapatılmış - 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

Lütfen bir [mcve] oluşturun. Kodunuz derlenmiyor. – Tunaki

+3

Bir akışta iki kez çalışamazsınız. Muhtemelen '// ...' içinde 'titleExclusions' üzerinde zaten çalışıyorsunuz. –

+1

Bu arada, her zaman bir 'Set' toplamanıza gerek yoktur (aksi takdirde, eğer çalışmanızı 'Set's ile yapmak istiyorsanız, sadece aralarındaki Stream API'sine geçiş yapmadan yapın). Öğeleriniz zaten farklı olduğundan, topla (Collectors.toSet()) .boyut() ', yalnızca" count() "ile aynıdır, ancak" stream.filter (tittle :: includes) .collect (Collectors.toSet (() == 0 'sadece "stream.noneMatch (tittle :: includes)" ile aynıdır… – Holger

cevap

5

Akımlar üzerinde birden çok kez çalışamazsınız, bu nedenle birden çok kez kullanabileceğiniz için Koleksiyonlar'ı kullanmaktan daha iyidir.

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. 

Not: Ben yerine boş olanlar setleri kaynak dosyadan olmayan boş satırları istediğini farz. filter, atılandan ziyade nelerin saklı tutulduğunu Predicate alır.

İkinci ifadeyi sadeleştirdiğiniz için teşekkür ederiz @Holger.

+1

'.filter (tittle :: içerir) .findAny(). IsPresent()' gerçekten 'anyMatch (tittle :: içerir)' ' – Tunaki

+4

@Tunaki:… ve'! (TitleExclusions.stream(). Filter (tittle :: içerir) .findAny() .isPresent()) 'titleExclusions.stream() ile aynıdır. noneMatch (tittle :: includes)'. – Holger