2、java8之streams介绍

2018-10-08  本文已影响0人  小manong

一、背景

前面学习可以知道,java8中新增加了lambda表达式特性,使编程模式得到大大的简化,而传统的java集合框架面临着大幅度的变化,但是从头实现一个新的集合框架(比如“Collection II”),但取代现有的集合框架是一项非常艰难的工作,因为集合接口渗透了 Java 生态系统的每个角落,将它们一一换成新类库需要相当长的时间。因此,决定采取演化的策略(而非推倒重来)以改进集合 API,在java8总具体做了如下工作:

1、为现有的接口(例如 Collection,List 和 Stream)增加扩展方法;
2、在类库中增加新的 流(stream,即 java.util.stream.Stream)抽象以便进行聚集(aggregation)操作;
3、改造现有的类型使之可以提供流视图(stream view);
4、改造现有的类型使之可以容易的使用新的编程模式,这样用户就不必抛弃使用以久的类库,例如 ArrayList 和 HashMap(当然这并不是说集合 API 会常驻永存,毕竟集合 API 在设计之初并没有考虑到 lambda 表达式。我们可能会在未来的 JDK 中添加一个更现代的集合类库)。
5、提供更加易用的并行(Parallelism)库

二、内部迭代和外部迭代

1、内部迭代

//为每一个shape设置颜色为红色
for (Shape shape : shapes) {
  shape.setColor(RED);
}

2、内部迭代

shapes.forEach(s -> s.setColor(RED));

总结:
外部迭代同时承担了 做什么(把形状设为红色)和 怎么做(得到 Iterator 实例然后依次遍历)两项职责,而内部迭代只负责 做什么,而把 怎么做 留给类库。通过这样的职责转变:用户的代码会变得更加清晰,而类库则可以进行各种优化,从而使所有用户都从中受益。

三、流Stream

Set<Box> hasBlueShape =
    shapes.stream()
          .filter(s -> s.getColor() == BLUE)
          .map(s -> s.getContainingBox())
          .collect(Collectors.toSet());
1、在 Collection 上调用 stream() 会生成该集合元素的流视图(stream view)
2、filter() 操作会产生只包含蓝色形状的流
3、map() 操作通过映射函数(这里的映射函数接收一个形状,然后返回包含它的盒子)对输入流里面的
元素进行依次转换,然后产生新流。
4、collect() 操作会把其接收的元素聚集(aggregate)到一起(这里是 Set)collect() 方法的参数
则被用来指定如何进行聚集操作

四、集合和流

五、并行流parallelStream

六、总结


参考资料:
http://zh.lucida.me/blog/java-8-lambdas-inside-out-library-features/

上一篇下一篇

猜你喜欢

热点阅读