Java 8 Stream基础操作汇总
📅 2022-11-18 15:54
👁️ 73
💬 0
Java 8 Stream操作汇总
// User实体类
@Data
public class User {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 性别 1-男 2-女
*/
private Integer sex;
/**
* 身高
*/
private Long height;
/**
* 体重
*/
private Double weight;
/**
* 体重
*/
private BigDecimal money;
}
// 获取用户列表
public static List<User> getUserList() {
User user1 = new User("小王", 18, 1,180L,60D, BigDecimal.valueOf(2000L));
User user2 = new User("小红", 17, 2,170L,55D, BigDecimal.valueOf(1000L));
User user3 = new User("小张", 19, 1,160L,50D, BigDecimal.valueOf(3000L));
User user4 = new User("小蓝", 16, 2,150L,51D, BigDecimal.valueOf(4000L));
return new ArrayList<>(Arrays.asList(user1, user2, user3, user4));
}
1.分组
要求:按性别分组
List<User> userList = getUserList();
Map<Integer, List<User>> collect = userList.stream()
.filter(e -> e.getSex() != null)
.collect(Collectors.groupingBy(User::getSex));
.collect(Collectors.groupingBy(User::getSex, Collectors.counting()));
/**
Result: key=1 value=[user1,user3]
key=2 value=[user2,user4]
**/
注意:分组字段(sex)不能为null,如果存在null会出现:element cannot be mapped to a null key
错误
2.分组统计
要求:统计不同性别人员个数
Map<Integer, Long> collect1 = userList.stream()
.filter(e -> e.getSex() != null)
.collect(Collectors.groupingBy(User::getSex, Collectors.counting()));
/**
Result: key=1 value=2
key=2 value=2
**/
// 分组后 取时间最新的一条数据
List<MemberSolutionVo> list = new ArrayList<>();
Map<String, MemberSolutionVo> collect = list.stream().collect(
Collectors.groupingBy(MemberSolutionVo::getUuid,
Collectors.collectingAndThen(Collectors.reducing((c1, c2) -> c1.getSolutionId().intValue() > c2.getSolutionId().intValue() ? c1 : c2),
Optional::get)));
list = new ArrayList<>(collect.values());
3.分组求和
要求:统计不同性别人员年龄之和
Map<Integer, Integer> collect = userList.stream()
.filter(e -> e.getSex() != null)
.collect(Collectors.groupingBy(User::getSex, Collectors.summingInt(User::getAge)));
/**
Result: key=1 value=37
key=2 value=33
**/
注意:
- 分组求和时,所调用的方法与求和字段有关,如 年龄字段类型为
Integer
,对应Collectors.summingInt(User::getAge)
Integer 类型 ==> Collectors.summingInt(User::getAge)
Double 类型 ==> Collectors.summingDouble(User::getWeight)
Long 类型 ==> Collectors.summingLong(User::getHeight)
Bigdecimal 类型 ==> Collectors.reducing(BigDecimal.ZERO, User::getMoney, BigDecimal::add)
eg. userList.stream()
.filter(e -> e.getSex() != null)
.collect(Collectors.groupingBy(User::getMoney, Collectors.reducing(BigDecimal.ZERO, User::getMoney, BigDecimal::add)));
4.最大最小值
要求:查询年龄最大最小的用户
// 最大
User user = userList.stream().max(Comparator.comparingInt(User::getAge)).get();
// 最小
User user = userList.stream().min(Comparator.comparingInt(User::getAge)).get();
5.排序
要求:按年龄排序
// sort默认为升序(从小到大)
List<User> collect = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
// 降序排序
List<User> collect = userList.stream()
.sorted(Comparator.comparing(User::getAge,Collections.reverseOrder()))
.collect(Collectors.toList());
// 多条件排序
List<User> collect= userList.stream().sorted(Comparator.comparing(User::getAge, Collections.reverseOrder())
.thenComparing(User::getName, Collections.reverseOrder())
.thenComparing(User::getHeight, Collections.reverseOrder())).collect(Collectors.toList());
6.交集
要求:两个用户列表中 姓名相同的用户
anyMathch:集合中,只有一个匹配 就返回true,否则返回false
public static List<User> getUserList1() {
User user1 = new User("小王", 18, 1,180L,60D, BigDecimal.valueOf(2000L));
User user2 = new User("小红", 16, 2,170L,55D, BigDecimal.valueOf(1000L));
User user3 = new User("小张", 19, 1,160L,50D, BigDecimal.valueOf(3000L));
User user4 = new User("小蓝", 16, 2,150L,51D, BigDecimal.valueOf(4000L));
return new ArrayList<>(Arrays.asList(user1, user2, user3, user4));
}
public static List<User> getUserList2() {
User user1 = new User("小王", 18, 1,180L,60D, BigDecimal.valueOf(2000L));
User user2 = new User("小蓝", 16, 2,170L,55D, BigDecimal.valueOf(1000L));
return new ArrayList<>(Arrays.asList(user1, user2));
}
List<User> userList1 = getUserList1();
List<User> userList2 = getUserList2();
List<User> collect1 = userList1.stream()
.filter(u1 ->
userList2.stream().anyMatch(u2 -> u2.getName().equals(u1.getName()))
)
.collect(Collectors.toList());
7.对象集合去重
根据对象中的某个字段去重
ArrayList<User> collect =
userList1.stream()
.collect(
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new));
8.差集
List<User> collect = userList1.stream().filter(u1 ->
userList2.stream().noneMatch(u2 -> u2.getName().equals(u1.getName()))
).collect(Collectors.toList());
9.List转Map
// key=id value=name
Map<String, String> collect= userList1.stream().collect(Collectors.toMap(User::getId,User::getName));
Map<String, String> collect1= userList1.stream().collect(Collectors.toMap(user-> {
return user.getCode() + "/" + user.getBriefName(); //(Id1+Id2)作为key
}, v1 -> Func.toStr(v1.getId())));
登录后才能查看或发表评论, 立即 登录