Java函数式编程->流的重用

知识点: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()方法来调用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值