前言:
stream()流的方法是从Java 8 开始诞生的。它是基于Lamada表达式的产物。也可以简单的将stram流当做一个foreach来看。对于操作数组或集合更加方便。且更加安全。因为它相当于取到我们的数据源后又做了一层SQL操作,但是并不会改变数据源,而是创建了一个新的容器存放操作后的数据。
环境搭建:
为了更符合业务。我们创建一个实体。
package org.java.demo;
import java.io.Serializable;
public class User implements Serializable {
//用户ID
private Long id;
//用户姓名
private String name;
//用户年龄
private Integer age;
//用户邮箱
private String email;
//↓get set 无参、有参构造器
//.....
}
public static void main(String[] args) {
User one = new User(1L,"one",12,"xxxx@163.com");
User two = new User(2L,"two",17,"xxxx@qq.com");
User three = new User(3L,"three",25,"xxxx@qq.com");
User four = new User(4L,"four",43,"xxxx@alibaba.com");
List<User> list = new ArrayList<>();
list.add(one);
list.add(two);
list.add(three);
list.add(four);
}
业务实操
1、取出集合对象的某一个属性,存至新的List集合中。
list.stream().map(User::getName).collect(Collectors.toList());
2、取出对象中某两个属性,成为key-value形式的map集合。
注意的是key值取数据源中唯一属性。
//id为key,name为value
list.stream().collect(Collectors.toMap(User::getId, User::getName));
//id为key,User对象为value 业务中比较常见。一般避免双重for循环时使用
list.stream().collect(Collectors.toMap(User::getId, User -> User));
3、取出集合对象某一数值类型属性相加
list.stream().mapToInt(User::getAge).sum();
4、取出集合对象中某一个属性去重后取出成新集合。
list.stream().map(User::getEmail).distinct().collect(Collectors.toList());
5、取出集合对象中某一个属性进行字符串拼接
// 使用流 取属性 操作 工具类的拼接方法 拼接符
list.stream().map(User::getName).collect(Collectors.joining("-"));
//输出:one-two-three-four
6、判断集合对象中的某一属性是否满足要求
//判断所有属性是否满足要求,全部满足返回true
list.stream().allMatch(k -> k.getAge() > 18);
//输出:flase
//判断所有属性中只要有满足要求的便会返回true
list.stream().anyMatch(k -> k.getAge() > 18);
//输出:true
7、过滤结合对象中的某一属性值
//过滤结合对象中,年龄大于20的封装成新集合
// 流 Lamda 判断 组装成新集合
list.stream().filter(k -> k.getAge() > 20).collect(Collectors.toList());
总结:
以上是我在工作中比较常用的几个方法。还有很多方法还需要补充学习。