使用Collection接口需要用户去做迭代(比如用for-each),这称为外部迭代。 相反,Streams库使用内部迭代——它帮你把迭代做了,还把得到的流值存在了某个地方,你只要给出一个函数说要干什么就可以了。下面的代码列表说明了这种区别。

    集合:用for-each循环外部迭代

    1. List<String> names = new ArrayList<>();
    2. for(Dish d: menu){ //显式顺序迭代菜单列表
    3. names.add(d.getName()); //提取名称并将其添加到累加器
    4. }

    请注意,for-each还隐藏了迭代中的一些复杂性。for-each结构是一个语法糖,它背后的东西用Iterator对象表达出来更要丑陋得多。
    集合:用背后的迭代器做外部迭代

    1. List<String> names = new ArrayList<>();
    2. Iterator<String> iterator = menu.iterator();
    3. while(iterator.hasNext()) { //显式迭代
    4. Dish d = iterator.next();
    5. names.add(d.getName());
    6. }

    流:内部迭代

    1. List<String> names = menu.stream()
    2. .map(Dish::getName) //用getName 方法参数化map,提取菜名
    3. .collect(toList()); //开始执行操作流水线;没有迭代