知识点:Java函数式编程->流的重用
在Java 8中,Stream不能重复使用,一旦被消耗或使用,流将被关闭,类似流水线,水龙头的水一样一去不复返。如果一不小心使用了一个已经被使用过的流,系统会抛出一个IllegalStateException,
表示流被消耗或关闭。
为了解决这个问题,可以使用Supplier类来重用流,例如下面这个案例:
Supplier<Stream<String>> languages = () -> Stream.of("Java", "C/C++/C#", "Javascript", "Python", "Golang", "Scheme", "Scala"); IntSummaryStatistics lengths = languages.get().parallel().collect(Collectors.summarizingInt(String::length)); System.out.println("The average of the lengths is: " + lengths.getAverage()); System.out.println("The longest of the languages is: " + lengths.getMax()); System.out.println(lengths.getCount()); System.out.println(lengths.getSum()); System.out.println("=============================="); for (Iterator<String> it = languages.get().iterator(); it.hasNext(); ) { String str = it.next(); System.out.println(str); }
jdk9中对Supplier类的定义是:
按照我个人的理解就是,Supplier的每次调用(get方法),就会从lambda表达式或者方法的定义中重新生成一个流,前后两个流不是同一个流,只是流的内容一样,这样就实现了对流的重用。
另外,
Supplier是一个函数式接口,不接受参数的传入,通过get()方法来调用。