JDK8之Stream
Java 8 引入了全新的 Stream API,可以使用声明的方式来处理数据,极大地方便了集合操作
什么是stream
stream(流)是一个来自数据源的元素队列,它可以支持聚合操作。
数据源:流的数据来源,构造Stream对象的数据源,比如通过一个List来构造Stream对象,这个List就是数据源;
聚合操作:对Stream对象进行处理后使得Stream对象返回指定规则数据的操作称之为聚合操作,比如filter、map、limit、sorted等都是聚合操作
具体操作
我们可以用stream对集合做精简的操作
首先建立一个class, 用于操作演示1
2
3
4
5
6
7
8
9
10
11
12
13
14public static class StreamClass {
long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String toString() {
String out = "{id:" + this.id + "}";
return out;
}
}
filter操作
用于筛选集合1
2
3
4
5
6
7
8// 通过流的方式筛选列表-filter
List<String> streamTestOrigin = new ArrayList<>();
streamTestOrigin.add("a");
streamTestOrigin.add("A");
List<String> streamListResult = streamTestOrigin.stream()
.filter(tmp -> tmp.compareTo("a")==0)
.collect(Collectors.toList());
System.out.println("筛选后的list: " + streamListResult);
输出结果:1
筛选后的list: [a]
map操作
用于提取集合中的相关属性, 生成新集合1
2
3
4
5
6
7
8
9
10
11
12// 获取对象列表中的某个成员列表
List<StreamClass> classList = new ArrayList<>();
StreamClass sc = new StreamClass();
StreamClass sc2 = new StreamClass();
sc.setId(1);
sc2.setId(2);
classList.add(sc);
classList.add(sc2);
List<Long> idList = classList.stream()
.map(streamClass -> streamClass.getId())
.collect(Collectors.toList());
System.out.println("获取的id列表: " + idList);
输出结果:1
获取的id列表: [1, 2]
limit操作
用于获取前n个元素1
2
3
4
5// 获取前n个元素
List<StreamClass> firstList = classList.stream()
.limit(1)
.collect(Collectors.toList());
System.out.println("前1个列表: " + firstList.toString());
输出结果:1
前1个列表: [{id:1}]
count操作
用于统计个数1
2
3
4
5// 获取筛选之后的个数
long count = streamTestOrigin.stream()
.filter(tmp -> tmp.compareTo("a")==0)
.count();
System.out.println("筛选后符合条件的个数: " + count);
输出结果:1
筛选后符合条件的个数: 1
sorted操作
用于对列表进行自定义排序, <0升序, >0降序1
2
3
4
5// 根据指定字段进行排序
List<StreamClass> sortList = classList.stream()
.sorted((el1, el2) -> {return (int)(el2.getId() - el1.getId());)
.collect(Collectors.toList());
System.out.println("排序之后的列表: " + sortList.toString());
输出结果:1
排序之后的列表: [{id:2}, {id:1}]
skip操作
用于跳过前n个元素1
2
3
4// 跳过前n个元素
List<StreamClass> skipList = classList.stream()
.skip(1).collect(Collectors.toList());
System.out.println("跳过前1个的列表: " + skipList);
输出结果:1
跳过前1个的列表: [{id:2}]
list-> map
可将list转化为map1
2
3
4// 将list转成id为key,对象为value的map
Map<Long ,StreamClass> map = classList.stream()
.collect(Collectors.toMap(scMap -> scMap.getId(), scMap -> scMap));
System.out.println("转换成map之后: " + map);
输出结果:1
转换成map之后: {1={id:1}, 2={id:2}}