java8 stream的一些用法(笔记)

  • 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);
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页