Collectors.groupingBy不接受空键

MarcG:

在Java 8中,这有效:

Stream<Class> stream = Stream.of(ArrayList.class);
HashMap<Class, List<Class>> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass));

但这不是:

Stream<Class> stream = Stream.of(List.class);
HashMap<Class, List<Class>> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass));

Maps允许使用null键,并且List.class.getSuperclass()返回null。但是Collectors.groupingBy在Collectors.java的第907行发出了NPE:

K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key"); 

如果我创建自己的收集器,则此行会更改为:

K key = classifier.apply(t);  

我的问题是:

1)Collectors.groupingBy的Javadoc并未说它不应该映射空键。是否出于某种原因需要此行为?

2)是否有另一种更简单的方法来接受空键,而不必创建自己的收集器?

MarcG:

对于第一个问题,我同意skiwi的观点,即它不应该抛出NPE我希望他们会对此进行更改(或者至少将其添加到javadoc中)。同时,为了回答第二个问题,我决定使用Collectors.toMap代替Collectors.groupingBy

Stream<Class<?>> stream = Stream.of(ArrayList.class);

Map<Class<?>, List<Class<?>>> map = stream.collect(
    Collectors.toMap(
        Class::getSuperclass,
        Collections::singletonList,
        (List<Class<?>> oldList, List<Class<?>> newEl) -> {
        List<Class<?>> newList = new ArrayList<>(oldList.size() + 1);
        newList.addAll(oldList);
        newList.addAll(newEl);
        return newList;
        }));

或者,将其封装:

/** Like Collectors.groupingBy, but accepts null keys. */
public static <T, A> Collector<T, ?, Map<A, List<T>>>
groupingBy_WithNullKeys(Function<? super T, ? extends A> classifier) {
    return Collectors.toMap(
        classifier,
        Collections::singletonList,
        (List<T> oldList, List<T> newEl) -> {
            List<T> newList = new ArrayList<>(oldList.size() + 1);
            newList.addAll(oldList);
            newList.addAll(newEl);
            return newList;
            });
    }

并像这样使用它:

Stream<Class<?>> stream = Stream.of(ArrayList.class);
Map<Class<?>, List<Class<?>>> map = stream.collect(groupingBy_WithNullKeys(Class::getSuperclass));

请注意,rolfl给出了另一个更复杂的答案,该答案使您可以指定自己的地图和列表供应商。我还没有测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

处理重复键Collectors.toMap()函数

拼合地图Collectors.groupingBy在java中后

修改与collectors.groupingBy在Java流返回地图值类型

Collectors.groupingBy(功能,供应商,收藏家)不接受的λ/这么想的看到流值

Collectors.groupingBy()返回的结果按升序排序的java

基于嵌套静态类属性Collectors.groupingBy

考虑空和空记录在Collectors.groupingBy相同

想不通Collectors.groupingBy的返回类型

Collectors.toMap()和Collectors.groupingBy()之间的差异,以收集到地图

Java的Collectors.groupingBy()---是列表排序?

如何在Java 6中实现Collectors.groupingBy?

映射Collectors.groupingBy()中的值

Java流Collectors.groupingBy()与字符串列表

从对象中为Collectors.groupingBy(x,toSet())提取值

Collectors.groupingBy用于可选字段的内部字段

如何使用Collectors groupingBy将频率映射到新对象?

为什么Collectors.groupingBy与身份功能混淆?

Java 8类型检查Collectors.groupingBy

由Collectors.groupingBy()生成的Java Stream Maintenance Map顺序

按地图结果到嵌套地图的Collectors.groupingBy

Java 8 Stream / Collectors映射键与Collectors.counting()

Java8 Collectors.groupingBy

Java Collectors.groupingBy找不到错误

Scala的Collectors.groupingBy()的替代方法

IllegalStateException: Collectors.toMap() 的“重复键”

Collectors.groupingBy 功能和对字段求和

如何从java中的Collectors.groupingBy返回不可修改的地图?

Java - Collectors.groupingBy - 過去 15 天

如何将 Collectors.collectingAndThen 与 Collectors.groupingBy 一起使用