stream java_Java 8之Stream适用场景

Stream是Java 8中的一个大的改进。Stream的功能是,支持集合的各种操作,比如filter, sum, max, min, average, map, reduce等等。所以我个人认为Stream的出现是基于以下原因:增强集合操作

拥抱函数式编程

充分利用Lambda

执行效率的提高 - 透明支持多线程集合操作

笔者尝试测试一下Stream并发处理的威力,发现面对特别简单的任务,Stream并发处理相较于传统的for each循环,执行效率没有优势。看起来Stream不是免费的午餐,创建Stream还是要一些开销的。所以这促使笔者思考该在什么场景下才使用Stream。

测试例子

笔者测试两个例子,一个任务非常简单,另外一个稍微复杂一点。从结果看起来,并行Stream总是比串行快,任务简单的情况,For Loop更快,任务复杂一点,并行Stream后来居上,并行带来的改进足以cover创建Stream的开销。

测试的小工具类public class TimeRecorder {

private long startTime;

private long endTime;

public void start() {

startTime = System.currentTimeMillis();

}

public long getDuration() {

endTime = System.currentTimeMillis();

long duration = endTime - startTime;

return duration;

}

}

任务非常简单的例子

只调用intValue这么一个小方法。public class StreamDemoSimple {

public static void main(String[] args) {

List intList = new LinkedList<>();

for (int i = 1; i <= 1000000; i++) {

intList.add(i);

}

TimeRecorder recorder = new TimeRecorder();

recorder.start();

intList.stream().forEach(i -> {

i.intValue();

});

System.out.println("Stream iterator:" + recorder.getDuration());

recorder.start();

intList.parallelStream().forEach(i -> {

i.intValue();

});

System.out.println("Parallel Stream iterator::" + recorder.getDuration());

recorder.start();

for (Integer i : intList) {

i.intValue();

}

System.out.println("Normal iterator: " + recorder.getDuration());

}

}

输出如下Stream iterator:67

Parallel Stream iterator::24

Normal iterator: 10

任务稍微复杂的例子

多执行了几步而已。public class StreamDemo {

public static void main(String[] args) {

List intList = new LinkedList<>();

for (int i = 1; i <= 1000000; i++) {

intList.add(i);

}

TimeRecorder recorder = new TimeRecorder();

recorder.start();

intList.stream().forEach(i -> {

i.intValue();

i.toString();

i.intValue();

i.toString();

});

System.out.println("Stream iterator:" + recorder.getDuration());

recorder.start();

intList.parallelStream().forEach(i -> {

i.intValue();

i.toString();

i.intValue();

i.toString();

});

System.out.println("Parallel Stream iterator:" + recorder.getDuration());

recorder.start();

for (Integer i : intList) {

i.intValue();

i.toString();

i.intValue();

i.toString();

}

System.out.println("Normal iterator:" + recorder.getDuration());

}

}

输出Stream iterator:426

Parallel Stream iterator:122

Normal iterator:253

Stream的适合场景集合操作超过两个步骤,比如先filter再for each,这时Stream显得优雅简洁,效率也高

任务较重,注重效能,希望并发执行,很容易的就隐式利用了多线程技术。非常好的使用时机。

函数式编程的编码风格里,Stream的设计初衷之一

结语

Lambda,Stream等等新特性使得Java函数式编程更为自然。合适的环境下非常值得合理使用。但是请记住Stream的创建以及传输也有损耗,特别简单的场景可能传统的For Loop更为适合。

编写参考:http://blog.csdn.net/kimylrong/article/details/47665501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值