Java 集合的迭代方式
集合的迭代
流使得程序员得以站在更高的抽象层次上对集合进行操作。
传统的迭代方法
直接看代码:
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 集合的迭代方式的更多相关文章
- java集合-Iterator迭代
我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代. Iterator iterator = list.iterator(); while(iterator.hasNext()){ Str ...
- java 集合遍历输出方式
Iterator:迭代输出 一旦操作集合的遍历输出,首选Iterator接口; ListIterator:Iterator子接口,专门输出List中的元素; Enumeration:古老的输出方式,迭 ...
- Java集合的遍历方式
Map的遍历 1.通过map.entrySet遍历Key和Value Map<Integer,Integer> map = new HashMap<>(); map.put(1 ...
- 【JAVA】StringTokenizer 迭代方式对字符串进行分割
StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数.1.构造函数public StringTokenizer(String str)public String ...
- JAVA集合迭代遍历和特性介绍
数组.集合:都是一种容器,用一个对象管理多个对象:数组不能自动增长:只能存放同类型的元素 集合能自动扩容:部分集合允许存放不同类型的元素: 1.List: 有顺序的,允许存放重复的元素: 遍历:for ...
- 细说java中Map的两种迭代方式
曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...
- 【java】TreeMap/HashMap的循环迭代中 keySet和entrySet和forEach方式 + map的几种迭代方式
参考链接:https://www.cnblogs.com/crazyacking/p/5573528.html ================================== java紫色代表迭 ...
- Java集合详解3:Iterator,fail-fast机制与比较器
Java集合详解3:Iterator,fail-fast机制与比较器 今天我们来探索一下LIterator,fail-fast机制与比较器的源码. 具体代码在我的GitHub中可以找到 https:/ ...
- Java集合详解3:一文读懂Iterator,fail-fast机制与比较器
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
随机推荐
- Linux CMD 笔记 & 正则表达式
一.linux bash 1. 进程名查找kill ps -ef | grep xxxx| grep -v grep| cut -c 9-15 | xargs kill -9 2.端口号kill 占用 ...
- Log4Net 使用及组合公共类
好记性不如烂笔头,这次是由衷的感受到了! log4net 是一个很好用的日志记录工具,引用入项目中,如何查看项目内部运行情况,如何快速定位异常信息,好的日志记录能帮很大的忙: log4net 很好用, ...
- CSS中的 position与Grid Layout
[1]CSS之Position(定位布局): 现css常用的属性有5种: 1.static 2.absolute 3.fixed 4.relative 5.sticky. 1.static 表示元素的 ...
- order by rand()优化
优化前: SELECT id, loan_id, NAME, company FROM tablename WHERE time BETWEEN 1522512000 AND 1525103999 A ...
- jQuery如何给DOM添加ID
ID每个元素只能有一个,ID名同一页面也不能重复,addID方法是不需要的,和其他属性一样用attr方法就行了, $(singleTarget).attr('id','idName'); 更简单的 $ ...
- Mybatis学习——Mybatis入门程序
MyBatis入门程序 一.查询用户 1.使用客户编号查询用户 (1).创建一个数据表 USE spring; #创建一个名为t_customer的表 CREATE TABLE t_customer( ...
- 吴裕雄--天生自然 PHP开发学习:面向对象
<?php class Site { /* 成员变量 */ var $url; var $title; /* 成员函数 */ function setUrl($par){ $this->u ...
- one_day_one_linuxCmd---wget命令
<坚持每天学习一个 linux 命令,今天我们来学习 wget 命令> Linux wget 是一个文件下载工具,它用在命令行下,使用也非常方便,不但体积小而且功能完善,并支持很多强大的功 ...
- PAT Advanced 1085 Perfect Sequence (25) [⼆分,two pointers]
题目 Given a sequence of positive integers and another positive integer p. The sequence is said to be ...
- (最全最灵活地)利用Jxl工具包实现Excel表的内容读取 、写入(可向已有表中追加数据)
1.引子 (1)读取 Jxl工具比较强大,可以方便地实现Excel表的读取和写入.另一款工具Poi也具有相似的功能,并且功能更多,运用也相对复杂.Poi读取Excel表内容时,需要先判断其内容格式,如 ...