Java8_关于list集合的操作Stream
一、前言
list的遍历在日常编程中,应用非常普遍,在Java8中,对list集合的操作做了书写上的简化,使代码更简洁。
在没有这些以前,我们写list的遍历是这样的
for(int i = 0;i<numList.size();i++){System.out.println(numList.get(i));
}
或者是这样的
for(Integer num : numList){System.out.println(num);
}
要做list的筛选,去重,求差,求并等操作就比较繁琐了,而Java8给我们带来新特性,是我们在做list集合操作时,非常简单。
二、举例子
有两个这样的集合
List<Integer> numList = new ArrayList();
numList.add(1);
numList.add(0);
numList.add(125);
numList.add(99);
numList.add(99);
numList.add(88);
//person有两个属性,一个是名称,一个是工作
List<Person> personList = new ArrayList<>();
personList.add(new Person("小红","程序员"));
personList.add(new Person("小明","程序员"));
personList.add(new Person("小雷","测试"));
personList.add(new Person("小泰","UI"));
2.1 list的遍历
遍历list元素
numList.forEach(num -> System.out.println(num));
2.2 list中每个元素做相同操作
将list中的每个元素乘2,变成新的集合
List<Integer> numListAfterCal = numList.stream().map(num->num*2).collect(Collectors.toList());
方法解析:
- stream():把集合转成了流
- map():接收一个函数作为参数, 把流里面的每个元素都执行一遍,并将其映射成一个新的元素。
- collect(Collectors.toList()):将结果转换成list
2.3 list元素筛选
筛选出小于200的元素,变成新的集合或者输出
List<Integer> numListAfterCal = numList.stream().map(num -> num * 2).filter(num -> num < 200).collect(Collectors.toList());
方法解析:
- filter() :筛选出满足条件的数据
numList.stream().map(num -> num * 2).filter(num -> num < 200).forEach(num -> {System.out.println(num);});
2.4 得到首个匹配到的结果
得到首个匹配到的结果
Optional<Integer> a = numList.stream().map(num -> num * 2).filter(num -> num < 200).findFirst();
2.6 去重、跳过元素、取元素数量
List<Integer> strListDistinct = numList.stream().distinct() //[1,0,125,99,88].skip(2) //[125,99,88].limit(2) //[125,99].collect(Collectors.toList());
方法解析:
- distinct():通过流中元素的 hashCode() 和 equals() 去除重复元素
- limit(n):获取n个元素
- skip(n):跳过n元素
2.5 list转成map
将personList按照工作类型分组
Map<String,List<Person>> map = personList.stream().collect(Collectors.groupingBy(Person::getJob));
得到结果如下:
{"程序员": [{"name": "小红","job": "程序员"},{"name": "小明","job": "程序员"}],"测试": [{"name": "小雷","job": "测试"}],"UI": [{"name": "小泰","job": "UI"}]
}
取出name和job组成一个map集合
Map<String, String> personMap = personList.stream().collect(Collectors.toMap(p -> p.getName(), p -> p.getJob()));
得到结果如下:
{"小雷":"测试","小泰":"UI","小明":"程序员","小红":"程序员"}
2.6 集合元素抽取出来,形成新集合
将personList中的人名抽取出来形成新的集合
List<String> list = personList.stream().map(Person::getName).collect(Collectors.toList());
如果需要对结果去重,加上.distinct()
List<String> list = personList.stream().map(Person::getName).distinct().collect(Collectors.toList());
得到结果如下:
["小红","小明","小雷","小泰"]
stream()优点
无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。