2016-08-18 44 views
1

我想要查找String s以特定字符開頭,使用相同的Stream兩次,但第二個Stream操作拋出異常。我怎樣才能重新使用Stream如何在執行一個操作後重新使用流

public static void main(String[] args) { 
    Stream<String> stream = Stream.of("abc", "aef", "bcd", "bef", "crf"); 
    stream.filter(s -> s.startsWith("a")).forEach(System.out::println);; 
    stream.filter(s -> s.startsWith("b")).forEach(System.out::println);; 
} 

異常

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed 
    at java.util.stream.AbstractPipeline.<init>(Unknown Source) 
    at java.util.stream.ReferencePipeline.<init>(Unknown Source) 
    at java.util.stream.ReferencePipeline$StatelessOp.<init>(Unknown Source) 
    at java.util.stream.ReferencePipeline$2.<init>(Unknown Source) 
    at java.util.stream.ReferencePipeline.filter(Unknown Source) 
    at StreamExp.main(StreamExp.java:13) 

回答

0

當您調用任何終端操作流關閉時,您可以使用流su用於構建新流的工具

Supplier<Stream<String>> streamSupplier = 
      () -> Stream.of("abc", "aef", "bcd", "bef", "crf"); 

      streamSupplier.get().filter(s -> s.startsWith("a")).forEach(System.out::println); 
      streamSupplier.get().filter(s -> s.startsWith("b")).forEach(System.out::println); 
2

不能在同一Stream執行兩次的終端操作如forEach

您有其他選擇。例如,您可以產生Map<Character,List<String>>在其中輸入String S被他們的第一個字符分組:

Map<Character,List<String>> groups = 
    Stream.of("abc", "aef", "bcd", "bef", "crf") 
      .collect(Collectors.groupingBy(s->s.charAt(0))); 

這將導致以下Map

{a=[abc, aef], b=[bcd, bef], c=[crf]} 
1

使用邏輯或結合您的流只有一個流:

public static void main(String[] args) { 
     Stream<String> stream = Stream.of("abc", "aef", "bcd", "bef", "crf"); 
     stream.filter(s -> s.startsWith("a") || s.startsWith("b")).forEach(System.out::println); 
} 
相關問題