使用Collection接口需要用户去做迭代(比如用for-each),这称为外部迭代。 相反,Streams库使用内部迭代——它帮你把迭代做了,还把得到的流值存在了某个地方,你只要给出一个函数说要干什么就可以了。下面的代码列表说明了这种区别。
集合:用for-each循环外部迭代
List<String> names = new ArrayList<>();
for(Dish d: menu){ //显式顺序迭代菜单列表
names.add(d.getName()); //提取名称并将其添加到累加器
}
请注意,for-each还隐藏了迭代中的一些复杂性。for-each结构是一个语法糖,它背后的东西用Iterator对象表达出来更要丑陋得多。
集合:用背后的迭代器做外部迭代
List<String> names = new ArrayList<>();
Iterator<String> iterator = menu.iterator();
while(iterator.hasNext()) { //显式迭代
Dish d = iterator.next();
names.add(d.getName());
}
流:内部迭代
List<String> names = menu.stream()
.map(Dish::getName) //用getName 方法参数化map,提取菜名
.collect(toList()); //开始执行操作流水线;没有迭代