java8新特性[2]:内部迭代和外部迭代(Internal vs external iteration)

Java8 增加了新的语言特性(例如 lambda 表达式和默认方法),为此 Java8 的类库也进行了很多改进,例如从外部迭代到内部迭代的改变。
集合类库主要依赖于外部迭代(external iteration)。Collection 实现 Iterable 接口,从而使得用户可以依次遍历集合的元素。比如我们需要把一个集合中的形状都设置成红色,那么可以这么写:

1

2

3

for (Shape shape : shapes) {

  shape.setColor(RED);

}


这个例子演示了外部迭代:for-each 循环调用 shapes 的 iterator() 方法进行依次遍历。外部循环的代码非常直接,但它有如下问题:
(1)Java 的 for 循环是串行的,而且必须按照集合中元素的顺序进行依次处理;
(2)集合框架无法对控制流进行优化,例如通过排序、并行、短路(short-circuiting)求值以及惰性求值改善性能。

尽管有时 for-each 循环的这些特性(串行,依次)是我们所期待的,但它对改善性能造成了阻碍。实际上,我们可以使用内部迭代(internal iteration)替代外部迭代,用户把对迭代的控制权交给类库,并向类库传递迭代时所需执行的代码。下面是前例的内部迭代代码:

1

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


尽管看起来只是一个小小的语法改动,但是它们的实际差别非常巨大。用户把对操作的控制权交还给类库,从而允许类库进行各种各样的优化(例如乱序执行、惰性求值和并行等等)。总的来说,内部迭代使得外部迭代中不可能实现的优化成为可能。
如上所示:外部迭代同时承担了做什么(把形状设为红色)和怎么做(得到 Iterator 实例然后依次遍历)两项职责,而内部迭代只负责做什么,而把怎么做留给类库。通过这样的职责发生了转变:用户的代码会变得更加清晰,而类库则可以进行各种优化,从而使所有用户都从中受益。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值