Java 如何在执行一个操作后重用流

Java 如何在执行一个操作后重用流,java,java-8,java-stream,Java,Java 8,Java 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);; strea

我想找出两次使用相同的
以特定字符开头的
字符串,但第二次
操作引发异常。如何重新使用

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);;
}
publicstaticvoidmain(字符串[]args){
流量=流量(“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)
线程“main”java.lang.IllegalStateException中的异常:流已被操作或关闭 位于java.util.stream.AbstractPipeline。(未知源) 位于java.util.stream.ReferencePipeline。(未知源) 位于java.util.stream.ReferencePipeline$StatelessOp。(未知源) 位于java.util.stream.ReferencePipeline$2。(未知源) 位于java.util.stream.ReferencePipeline.filter(未知源) 位于streamxp.main(streamxp.java:13)
您不能在同一
流上执行两次终端操作,例如
forEach

你还有其他选择。例如,您可以生成一个
映射
,其中输入的
字符串
按其第一个字符分组:

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

使用逻辑或将您的流合并为一个流:

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);
}
publicstaticvoidmain(字符串[]args){
流量=流量(“abc”、“aef”、“bcd”、“bef”、“crf”);
stream.filter(s->s.startsWith(“a”)| | s.startsWith(“b”)).forEach(System.out::println);
}

当您调用任何终端操作时,流已关闭,您可以使用流供应商构建新流

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);
Supplier-streamSupplier=
()->“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);
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);