用于空键的java流groupBy收集器和分组值列表上的应用收集器

用于空键的java流groupBy收集器和分组值列表上的应用收集器,java,java-8,java-stream,Java,Java 8,Java Stream,我有以下的班级定义- class Employee { Long key; String initials; Integer age; } 下面是IntWrapper类的定义- class IntWrapper { private Integer i; } 我在一个列表中收集了员工对象list=… 现在我想创建一个映射,其中key是初始值

我有以下的班级定义-

    class Employee {

                Long key;
                String initials;
                Integer age;
    }
下面是
IntWrapper
类的定义-

    class  IntWrapper {
            private Integer i;
    }
我在一个列表中收集了员工对象
list=…

现在我想创建一个
映射
,其中key是初始值,value是具有该初始值的员工的最大年龄

Map<String, IntWrapper> result = empList.stream().filter(e -> e.getInitials() != null)
    .collect(Collectors.toMap(e -> e.getInitials(), x -> new IntWrapper(x.getAge()),
        BinaryOperator.maxBy(Comparator.comparing(IntWrapper::getI))));
我通过以下逻辑实现了这一点-

    Map<String, IntWrapper> r2 = empList.stream().collect(Collectors.groupingBy(e -> e.getName(),
                    Collectors.collectingAndThen(Collectors.maxBy(Comparator.nullsLast(Comparator.comparingInt(Employee::getAge))), empOpt -> empOpt.map(x -> new IntWrapper(x.getAge())).orElseGet(() -> null) )));
Map r2=empList.stream().collect(收集器.groupingBy(e->e.getName(),
Collectors.collectingAndThen(Collectors.maxBy(Comparator.nullslat(Comparator.comparingit(Employee::getAge))),emopt->emopt.map(x->new IntWrapper(x.getAge()).orElseGet(()->null));
如果没有姓名首字母为空的员工,这里的一切都正常。如果存在,则抛出NullPointerException

我在这篇文章中找到了一个使用空键的groupby解决方案

公共静态收集器

groupingBy_with NullKeys(函数如果您想忽略姓名首字母为空的员工,您可以筛选姓名首字母为空的员工,然后将其收集为映射

Map<String, IntWrapper> result = empList.stream().filter(e -> e.getInitials() != null)
    .collect(Collectors.toMap(e -> e.getInitials(), x -> new IntWrapper(x.getAge()),
        BinaryOperator.maxBy(Comparator.comparing(IntWrapper::getI))));

是的,你是对的,刚发现测试时我没有总结这是个问题。更新。谢谢指出。
Map<Optional<String>, IntWrapper> result = empList.stream().filter(e -> e.getInitials() != null)
        .collect(Collectors.toMap(e -> Optional.ofNullable(e.getInitials()), x -> new IntWrapper(x.getAge()),
            BinaryOperator.maxBy(Comparator.comparing(IntWrapper::getI))));