目录
前言
在上篇,学习了如何将单列集合、双列集合、数组、零散数据转换成Stream流,在下篇,将学习中间方法和终结方法,即对Stream流进行过滤、切块、包装,最终产出我们想要的成品。
一、Stream流的中间操作
| 名称 | 说明 |
|---|---|
| Stream<T> filter(Predicate<? super T> predicate) | 过滤 |
| Stream<T> limit(long maxSize) | 获取前几个元素 |
| Stream<T> skip(long n) | 跳过前几个元素 |
| Stream<T> distinct() | 元素去重,依赖hashCode和equals方法 |
| static<T> Stream<T> concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
| Stream<R> map(Function<T, R> mapper) | 转换流中的数据类型 |
| [Stream流的中间方法] |
注1:使用中间方法会返回新的Stream流了,原来的Stream流只能使用一次,建议使用链式编程
注2:修改Stream流中的数据,不会影响原来集合或者数组中的数据。
1.filter过滤
需求:将姓李的名字长度为3的人名过滤出来。
使用方法:
java
public class Test {
public static void main(String[] args) {
//Stream的过滤filter
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "李二", "张三", "王五", "李老板", "李世民", "王二");
list.stream()
.filter(s -> s.startsWith("李"))
.filter(s -> s.length() == 3)
.forEach(s -> System.out.println(s));
}
}
输出:

2.limit获取前n个元素
需求:获取前三个元素。
使用方法:
java
public class Test {
public static void main(String[] args) {
//Stream的过滤filter
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "李二", "张三", "王五", "李老板", "李世民", "王二");
//Stream的limit
list.stream()
.limit(3)
.forEach(s -> System.out.println(s));
}
}
输出:

3.skip跳过前n个元素
需求:跳过前4个元素。
使用方法:
java
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "李二", "张三", "王五", "李老板", "李世民", "王二");
//Stream的skip
list.stream()
.skip(4)
.forEach(s -> System.out.println(s));
}
}
输出:

4.distinct去重
需求:去除流中重复的元素。
使用方法:
java
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "李二", "张三","张三","张三", "王五", "李老板", "李世民", "王二");
//Stream中的distinct去重
list.stream()
.distinct()
.forEach(s -> System.out.println(s));
}
}
输出:

5.concat拼接
需求:将两个流进行拼接
使用方法:
java
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "李二", "张三","张三","张三", "王五", "李老板", "李世民", "王二");
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list, "李四", "王五");
//Stream中的concat拼接
Stream.concat(list.stream(), list2.stream())
.forEach(s -> System.out.println(s));
}
}
6.map类型转换
使用方法:
Function中的两个类型,第一个类型表示流的类型,第二个类型表示希望转换成的类型。
apply的形参s:依次表示流里面的每一个数据。
apply的返回值:表示转换之后的数据。
java
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三-13", "李四-14", "王五-15");
list.stream()
.map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
String[] split = s.split("-");
String ageString = split[1];
int age = Integer.parseInt(ageString);
return age;
}
})
.forEach(s -> System.out.println(s));
}
}
转换成Lambda表达式:
list.stream()
.map(s -> Integer.parseInt(s.split("-")[1]))
.forEach(s -> System.out.println(s));
二、Stream流中的终结方法
| 名称 | 说明 |
|---|---|
| void forEach(Consumer action) | 遍历 |
| long count() | 统计 |
| toArray() | 收集流中的数据,放到数组中 |
| collect(Collector collector) | 收集流中的数据,放到集合中 |
1.forEach遍历
list.stream().forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
转换成Lambda表达式
list.stream()
.forEach(s -> System.out.println(s));
2.count统计
long count = list.stream().count();
System.out.println(count);
3.toArray转换成数组
IntFunction的泛型:具体类型的数组
apply的形参:流中数据的个数,要跟数组的长度保持一致。
apply的返回值:具体类型的数组
方法体:创建数组
//toArray
String[] array = list.stream().toArray(new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
});
System.out.println(Arrays.toString(array));
转换成Lambda表达式
String[] array = list.stream()
.toArray(value -> new String[value]);
4.collect收集
collect可以将流转换成List、Set、Map类型。
toMap参数一:表示键的生成规则
toMap参数二:表示值的生成规则
Function泛型一:表示流中每一个数据的类型
Function泛型二:表示Map集合中键/值的数据类型
方法apply形参:依次表示流里面的每一个数据
方法apply方法体:生成键/值的代码
方法apply返回值:已经生成的键/值
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三疯-男-19", "李四海-男-20", "王老五-男-25", "李凤-女-18", "刘大壮-男-20");
Map\<String, Integer\> collect = list.stream()
.filter(s -\> "男".equals(s.split("-")\[1\]))
.collect(Collectors.toMap(new Function\<String, String\>() {
@Override
public String apply(String s) {
return s.split("-")\[0\];
}
}, new Function\<String, Integer\>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s.split("-")\[2\]);
}
}));
System.out.println(collect);
}
}
转换成Lambda表达式:
Map<String, Integer> collect = list.stream()
.filter(s -> "男".equals(s.split("-")[1]))
.collect(Collectors.toMap(s -\> s.split("-")\[0\], s -\> Integer.parseInt(s.split("-")\[2\])));
😶🌫️😶🌫️😶🌫️