Java8用了这么久了,Stream 流用法及语法你都知道吗?
2021-04-13 06:29
标签:静态 pre 部分 静态方法 set fun ted 年龄 eal Stream流 最全的用法 为什么用Java 8 Stream ?因为 操作简单 filter:过滤流中的某些元素(可以做一些基本的判空、替换、判断逻辑操作) map:接收一个函数作为参数,该函数会被应用到每个元素上,映射成一个新的元素。 sorted():自然排序,流中元素需实现Comparable接口 然后 看下sort用法 allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false 匹配执行结果 Reduce 就是组合操作 reduce 执行结果 这是个最最最最最基本的操作,10个流操作 9个都会使用到当前操作 collect(Collectors.toList()) 转换List 大家看完有什么不懂的可以在下方留言讨论,也可以关注我私信问我,我看到后都会回答的。也欢迎大家关注我的公众号:前程有光,金三银四跳槽面试季,整理了1000多道将近500多页pdf文档的Java面试题资料,文章都会在里面更新,整理的资料也会放在里面。谢谢你的观看,觉得文章对你有帮助的话记得关注我点个赞支持一下! Java8用了这么久了,Stream 流用法及语法你都知道吗? 标签:静态 pre 部分 静态方法 set fun ted 年龄 eal 原文地址:https://blog.51cto.com/14801695/2511759
Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,Stream API 提供了一种高效且易于使用的处理数据的方式
为什么操作简单?因为 Lambda 表达式,它极大的提高了编程效率和程序可读性
怎么操作流? 首先你的有个数据源(数组、集合),操作会产生新的流对象,原来的流对象不会改变
流用法有结束操作,这种代码不是你写了一个方法就执行一个方法,而是最后触发结束操作的时候才统一执行的,collect、foreach 方法就是一种结束方法,详情看代码及结果参考 2.映射map、flatMap用法 部分2.具体用法
2.1 创建流
// 集合创建流
List
2.2 操作流
1.过滤
limit(n):获取n个元素,结果获取几个元素
skip(n):跳过n元素,配合limit(n)可实现分页
distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素 //filter 判空
Stream
2.映射
flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
peek:这个操作很骚,类似map只不过map 是Func函数,提供返回值,而peer是取出元素,Consumer表达式设值,我个人觉得没啥区别呢,官方文档提示:该方法主要用于调试,做一些消耗这个对象但不修改它的东西,没啥事不要用
很想问一下 这俩map、flatMap 区别 ,细品,你细品,你细细品
map是将每个元素 映射成一个新元素,除非你过滤了,否则不会改变元素个数
flatMap是将原流中的每个值都变成另一个流,然后把流合并串起来,必须有返回值,拼装成新的流 //map 把包含a的元素,替换成| 注意,注意, 元素还是一个整体,对每个元素
Stream
map执行结果
//看下执行结果,说明 collect才是结束操作,代码结束,但是并不是真正结束
1===========
2=========== peek代码结束,但是日志没打印
Filtered value: a,b,c
Mapped value: A,B,C
Filtered value: a,e,f
Mapped value: A,E,F
Filtered value: g,h,i
Mapped value: G,H,I
3=========== collect结束操作,代码日志打印
A,B,C
A,E,F
G,H,I
3.排序
sorted(Comparator com):定制排序,自定义Comparator排序器
先构建一个User类 public static class User {
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name=‘" + name + ‘\‘‘ +
", age=" + age +
‘}‘;
}
}
//按字母排序
Stream
sort 执行结果
a,b,i
a,d,c
a,e,f
User{name=‘aa‘, age=2}
User{name=‘aa‘, age=4}
User{name=‘bb‘, age=1}
User{name=‘cc‘, age=3}
4.流匹配
noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false
findFirst:返回流中第一个元素
findAny:返回流中的任意元素
count:返回流中元素的总个数
max:返回流中元素最大值
min:返回流中元素最小值 List
allMatch1:true
allMatch2:false
noneMatch:true
anyMatch:true
findFirst:3
findAny:3
count:5
max:10
min:3
5.组合操作
Reduce(BinaryOperator accumulator) 没有起始值,按照运算规则进行运算操作
解释:第一次执行时,accumulator函数的第一个参数为流中的第一个元素,第二个参数为流中元素的第二个元素,按照函数进行操作;
第二次执行时,第一个参数为第一次函数执行操作的结果,第二个参数为流中的第三个元素;往下依次类推,返回Optinal 通过get()方法获取结果
Reduce(T identity, BinaryOperator accumulator)含有初始值,第二个是第一个的变形,跟第一个方法对比,不同的是此次这个会接受一个identity参数,用来指定Stream循环的初始值。如果Stream为空,就直接返回该值,特殊:该方法不会返回 OptionalOptional sumResult = Stream.of(1, 2, 3, 4)
.reduce((sum, item) -> {
System.out.println("sum : " + sum);
sum += item;
System.out.println("item: " + item);
System.out.println("sum+ : " + sum);
System.out.println("-----——---");
return sum;
});
System.out.println("========sumResult: " + sumResult.get());
Integer sumDefineResult = Stream.of(1, 2, 3, 4)
.reduce(100, (sum, item) -> {
System.out.println("sum : " + sum);
sum += item;
System.out.println("item: " + item);
System.out.println("sum+ : " + sum);
System.out.println("---——-----");
return sum;
});
System.out.println("========sumDefineResult: " + sumDefineResult);
//下面是执行结果
//查看执行结果
sum : 1
item: 2
sum+ : 3
-----——---
sum : 3
item: 3
sum+ : 6
-----——---
sum : 6
item: 4
sum+ : 10
-----——---
========sumResult: 10
sum : 100
item: 1
sum+ : 101
---——-----
sum : 101
item: 2
sum+ : 103
---——-----
sum : 103
item: 3
sum+ : 106
---——-----
sum : 106
item: 4
sum+ : 110
---——-----
========sumDefineResult: 110
6. 收集转换操作
collect(Collectors.toSet()) 转换Set
Collectors.toMap(key, value) 转换Map ,如果key重复,!!!报错
Collectors.joining() join进行拼接
Collectors.groupingBy(key) 以Key为map的 key分组
Collectors.partitioningBy(规则) 以规则分区 比如 >5 ,map key为true,false User s1 = new User("aa", 1);
User s2 = new User("bb", 2);
User s3 = new User("cc", 3);
User s4 = new User("dd", 2);
List
collect 执行结果
[1, 2, 3, 2]
[1, 2, 3]
{dd=2, cc=3, bb=2, aa=1}
(aa,bb,cc,dd)
{1=[User{name=‘aa‘, age=1}], 2=[User{name=‘bb‘, age=2}, User{name=‘dd‘, age=2}], 3=[User{name=‘cc‘, age=3}]}
{1={1=[User{name=‘aa‘, age=1}]}, 2={2=[User{name=‘bb‘, age=2}, User{name=‘dd‘, age=2}]}, 3={3=[User{name=‘cc‘, age=3}]}}
{false=[User{name=‘aa‘, age=1}, User{name=‘bb‘, age=2}, User{name=‘dd‘, age=2}], true=[User{name=‘cc‘, age=3}]}
最后
文章标题:Java8用了这么久了,Stream 流用法及语法你都知道吗?
文章链接:http://soscw.com/index.php/essay/75077.html