The World Best ST.

JDK8之Stream

字数统计: 726阅读时长: 3 min
2019/12/23 Share

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
14
public static class StreamClass {
long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
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转化为map

1
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}}

本文参考资料:
http://www.macrozheng.com/#/technology/java_stream

CATALOG
  1. 1. JDK8之Stream
    1. 1.1. 什么是stream
    2. 1.2. 具体操作
      1. 1.2.1. filter操作
      2. 1.2.2. map操作
      3. 1.2.3. limit操作
      4. 1.2.4. count操作
      5. 1.2.5. sorted操作
      6. 1.2.6. skip操作
      7. 1.2.7. list-> map