集合的迭代
流使得程序员得以站在更高的抽象层次上对集合进行操作。
传统的迭代方法
直接看代码:

List<Dog> dogs = new ArrayList<>();
                dogs.add(new Dog("大黄", 2));
                dogs.add(new Dog("小黑", 3));
                dogs.add(new Dog("小哈",1));
                
                //最原始的 for 循环
                for (int i = 0; i < dogs.size(); i++) {
                        System.out.println(dogs.get(i));
                }
                //增强 for 循环
                for (Dog dog1 : dogs) {
                        System.out.println(dog1);
                }
                //使用迭代器
                Iterator<Dog> it = dogs.iterator();
                while (it.hasNext()) {
                        Dog dog2 = it.next();
                        System.out.println(dog2);
                }
说明:
增强 for 循环,只是一个语法糖(Syntax Sugar),它的本质就是使用 迭代器进行迭代。所以在,增强 for 循环里面,无法修改集合。这里也可以使用 while 来迭代 ,但是 while 还没有 for 循环方便呢。

Stream 和 Lambda 进行集合迭代
//使用 Stream 和 Lambda 表达式进行迭代
dogs.stream().forEach(System.out::println);

//只使用 Lambda 表达式进行迭代
dogs.forEach(System.out::println);

这样看似乎是下面这个更简单点,但是 Stream 的作用远不止于此,它可以将多个操作,串联起来,使用 链式编程的方法,实现很复杂的操作。下面这个只是使用 Lambda 进行遍历操作而已。

流和集合
流(Stream)是一种内部迭代方式,可以通过集合直接获取到相应的 流(Stream),例如:Stream<Dog> stream = dogs.stream();,当然了也可以从流获取集合 List<Dog> dogs = stream.collect(Collectors.toList());.。这里只是以 List 集合为例,Map 和 Set 也是可以的。准确的说,流 开启了操作集合的新的方法,使用函数式编程来重构以前的代码,也是非常的不错的。

这个只举一个简单的例子:就可以看出使用 Stream 是多么的方便了。
有一个集合里面存储了 数字和非数字字符串,现在想要求这些数字字符串的和:
“1” “2” “3” “a” “4” “5” “c” “6” “7” “8” “d” “9” "10"

方式一:推荐使用,采用函数式编程(链式编程):

List<String> mixStr = new ArrayList<String>(Arrays.asList("1", "2", "3", "a", "4", "5", "c", "6", "7", "8", "d", "9", "10"));
int sumary = mixStr.
                stream().
                filter(s->s.matches("^[0-9]*$")).
                map(Integer::parseInt).
                reduce(0, (acc, e)->acc+e);
System.out.println("方式一(推荐):"+sumary);

//有时候,一行太长了,可以分开写,这样增加了可读性。
sumary = mixStr.stream().filter(s->s.matches("^[0-9]*$")).map(Integer::parseInt).reduce(0, (acc, e)->acc+e);

方式二:不推荐使用,采用函数式编程(不使用链式编程):

Stream<String> filter = mixStr.stream().filter(s->s.matches("^[0-9]*$"));
Stream<Integer> map = filter.map(Integer::parseInt);
Integer reduce = map.reduce(0, (acc, e)->acc+e);
System.out.println(""+reduce);
System.out.println("方式二(不推荐):"+reduce);
这样做增加了很多繁琐的步骤和临时变量,这和函数式编程的思想是相反的,但是这样可以帮助我们学习,理解函数式编程。

方式三:传统的集合操作

sumary = 0;
for (String s : mixStr) {
        if (s.matches("^[0-9]*$")) {
                sumary += Integer.parseInt(s);
        }
}
System.out.println("传统的方式:"+sumary);
这样看似乎,还是传统的方式比较简单,可能和这个例子有关,但是仔细分析还是能看出流和集合操作的差异,在流中每一步都是明确的,而且每一步(中间操作,不是终结操作,这个可以自己了解)都是返回一个流,而集合却将这些都耦合到一起了,所以很难修改,而流就很简单了,替换一个中间步骤是很简单的。
例如,只是将reduce过程去掉,换成 forEach 遍历,这需要改变最后一个操作即可,是不是很方便。

//流的用处很多。
mixStr.stream().filter(s->s.matches("^[0-9]*$")).map(Integer::parseInt).forEach(System.out::print);
运行截图:
<ignore_js_op>

说明
这个主要是对集合的遍历来说流的好处,并不是说流的(我也是才开始了解,并不是很深入,这里可能只是一条皮毛吧,希望大家喜欢。),如果感兴趣可以参考相关的博客或者书籍,阅读关于流的知识,可以说,流开启了新的时代,正如开头那句话所说的。

更多java学习资料可关注:itheimaGZ获取

Java 集合的迭代方式的更多相关文章

  1. java集合-Iterator迭代

    我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代. Iterator iterator = list.iterator(); while(iterator.hasNext()){ Str ...

  2. java 集合遍历输出方式

    Iterator:迭代输出 一旦操作集合的遍历输出,首选Iterator接口; ListIterator:Iterator子接口,专门输出List中的元素; Enumeration:古老的输出方式,迭 ...

  3. Java集合的遍历方式

    Map的遍历 1.通过map.entrySet遍历Key和Value Map<Integer,Integer> map = new HashMap<>(); map.put(1 ...

  4. 【JAVA】StringTokenizer 迭代方式对字符串进行分割

    StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数.1.构造函数public StringTokenizer(String str)public String ...

  5. JAVA集合迭代遍历和特性介绍

    数组.集合:都是一种容器,用一个对象管理多个对象:数组不能自动增长:只能存放同类型的元素 集合能自动扩容:部分集合允许存放不同类型的元素: 1.List: 有顺序的,允许存放重复的元素: 遍历:for ...

  6. 细说java中Map的两种迭代方式

    曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...

  7. 【java】TreeMap/HashMap的循环迭代中 keySet和entrySet和forEach方式 + map的几种迭代方式

    参考链接:https://www.cnblogs.com/crazyacking/p/5573528.html ================================== java紫色代表迭 ...

  8. Java集合详解3:Iterator,fail-fast机制与比较器

    Java集合详解3:Iterator,fail-fast机制与比较器 今天我们来探索一下LIterator,fail-fast机制与比较器的源码. 具体代码在我的GitHub中可以找到 https:/ ...

  9. Java集合详解3:一文读懂Iterator,fail-fast机制与比较器

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

随机推荐

  1. plt画log图

    import matplotlib.pyplot as plt import math import numpy as np x = np.arange(-0.85,0.95,0.05) #获得函数结 ...

  2. import torch 报错

    1.进入官网   https://pytorch.org/ 2.复制command到anaconda环境,即可

  3. LeetCode No.166,167,168

    No.166 FractionToDecimal 分数到小数 题目 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数. 如果小数部分为循环小数 ...

  4. day68-CSS-float浮动,clear清除浮动,overflow溢出

    1. float 浮动 1.1 在 CSS 中,任何元素都可以浮动. 1.2 浮动元素会生成一个块级框,而不论它本身是何种元素.内联标签设置浮动,就变成了块级标签. 1.3 关于浮动的两个特点: 浮动 ...

  5. Python—使用列表构造队列数据结构

    队列的概念 只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表:进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列):队列具有先进先出(FIFO)的特性. # _*_ ...

  6. 销售de经典语录

    [销售的境界] 1.顾客要的不是便宜,而是感觉上占了便宜: 2.不要与顾客争论价格,要与顾客讨论价值: 3.没有不对的客户,只有不够好的服务: 4.卖什么不重要,重要的是怎么卖: 5.没有最好的产品, ...

  7. 关于图算法 & 图分析的基础知识概览

    网址:https://learning.oreilly.com/library/view/graph-algorithms-/9781492060116/ 你肯定没有读过这本书,因为这本书的发布日期是 ...

  8. 1. react 基础 简介 及 环境搭建

    一.简介 由 Facebook 推出 2013 年 开源 的 函数式编程的 使用人数最多的 前端框架 拥有健全的文档与完善的社区 ( 官网 ) react 16 称为 React Fiber ( 底层 ...

  9. ElasticSearch使用小结

    最近有个业务需求,即全文搜索关键字查询列表,因而转向ES的学习,也学习了大半个月了,做个笔记,总结下自己的学习历程. 独自学习一项新技术,总是难免走不少弯路的,在此推荐下ES的基础教程,对,好好学习官 ...

  10. VMware vSphere虚拟化-VMware ESXi 5.5组件添加本地磁盘--虚拟机扩容

    本地存储器可以是位于ESXi主机内部的内部硬盘,也可以是位于主机之外并直接通过SAS或者SATA等协议连接在主机上的外部存储系统.本地存储不需要存储网络即可与主机进行通信,只需要一根连接到存储单元的电 ...