- groupingBy(分组方法)进行单字段分组。
List<User> list = new ArrayList<>();
Map<String, List<User>> usernameGroupByMap =
userList.stream().collect(Collectors.groupingBy(User::getUsername));
map对流中数据进行转换。
List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5);
//第一种写法
List<String> strList = numList.stream().map(String::valueOf).collect(Collectors.toList());
//第二种写法(这种写法就可以在里面写一些判断语句,如果要将null值设置为0的话可以这样写),多用于计算时使用
List<Integer> nonNullList = numList.stream().map(num -> num == null ? 0 : num).collect(Collectors.toList());
//实体类时可以这样使用
List<Integer> ageList = userList.stream().map(User::getAge).collect(Collectors.toList());
- groupingBy(分组方法)多字段分组。
List<User> userList = Arrays.asList(
new User().setId(1).setUsername("gideon").setPassword("888").setAge(1),
new User().setId(2).setUsername("gideon").setPassword("888").setAge(2),
new User().setId(3).setUsername("young").setPassword("888").setAge(3),
new User().setId(4).setUsername("yang").setPassword("888").setAge(null)
);
Map<String, List<User>> groupingByMap = userList.stream()
.collect(Collectors.groupingBy(user -> user .getPassword() + user.getUsername()));
System.out.println(groupingByMap);
结果如下图:
- toMap实体类的两个字段转Map
List<User> list = new ArrayList<>();
Map<Integer, String> map = list.stream()
.collect(Collectors.toMap(User::getId, User::getUsername));
- reduce基本数据类型运算(需要将空值置为0不然会报空指针)。
List<Integer> integerList = Arrays.asList(1, 2, 3, null, 5);
Integer sum = integerList.stream().map(num -> num == null ? 0 : num).reduce(Integer::sum).orElse(0);
//如果需要一些聚合函数可以这样写
IntSummaryStatistics statistics = integerList.stream().map(num -> num == null ? 0 : num).collect(Collectors.toList()).stream().collect(Collectors.summarizingInt(Integer::intValue));
结果如下:
IntSummaryStatistics{count=5, sum=11, min=0, average=2.200000, max=5}
- reduce实体类单个字段运算排除空值(需要将空值置为0不然会报空指针)(类似于4,多了一个map)
List<User> userList = new ArrayList<>();
Integer ageSum = userList.stream().map(User::getAge).map(age -> age == null ? 0 : age).reduce(Integer::sum).orElse(0);
//如果需要一些聚合函数可以这样写
IntSummaryStatistics summaryStatistics = userList.stream().map(User::getAge).map(age -> age == null ? 0 : age).collect(Collectors.toList()).stream().collect(Collectors.summarizingInt(Integer::intValue));
- peek其实和4,5点的排除空值有点类似。
Integer sum = userList.stream().peek(user -> user.setAge(user.getAge() == null ? 0 : user.getAge())).map(User::getAge).reduce(Integer::sum).orElse(0);