一、前言
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只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。