java8新特性:流(Stream)的介绍

流是Java8 类库中新增的关键抽象,它被定义于 java.util.stream,这个包里有若干流类型:Stream<T> 代表对象引用流,此外还有一系列特化(specialization)流,比如 IntStream 代表整形数字流。每个流代表一个值序列,流提供一系列常用的聚集操作,使得我们可以便捷的在它上面进行各种运算。集合类库也提供了便捷的方式使我们可以以操作流的方式使用集合、数组以及其它数据结构。流的操作可以被组合成流水线(Pipeline)。以上文的例子为例,如果我们只想把蓝色改成红色:

1

2

3

shapes.stream()

      .filter(s -> s.getColor() == BLUE)

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

在 Collection 上调用 stream() 会生成该集合元素的流视图(stream view),接下来 filter() 操作会产生只包含蓝色形状的流,最后,这些蓝色形状会被 forEach 操作设为红色。如果我们想把蓝色的形状提取到新的 List 里,则可以:

1

2

3

4

List<Shape> blue =

    shapes.stream()

          .filter(s -> s.getColor() == BLUE)

          .collect(Collectors.toList());

collect() 操作会把其接收的元素聚集(aggregate)到一起,这里是 List,collect()方法的参数则被用来指定如何进行聚集操作。在这里我们使用 toList() 以把元素输出到 List 中。
如果每个形状都被保存在 Box 里,然后我们想知道哪个盒子至少包含一个蓝色形状,我们可以这么写:

1

2

3

4

5

Set<Box> hasBlueShape =

    shapes.stream()

          .filter(s -> s.getColor() == BLUE)

          .map(s -> s.getContainingBox())

          .collect(Collectors.toSet());

map() 操作通过映射函数(这里的映射函数接收一个形状,然后返回包含它的盒子)对输入流里面的元素进行依次转换,然后产生新流。
如果我们需要得到蓝色物体的总重量,我们可以这样表达:

1

2

3

4

5

int sum =

    shapes.stream()

          .filter(s -> s.getColor() == BLUE)

          .mapToInt(s -> s.getWeight())

          .sum();

这些例子演示了流框架的设计,以及如何使用流框架解决实际问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值