在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)是否有另一种更简单的方法来接受空键,而不必创建自己的收集器?

最佳答案

我有同样的问题。
这失败了,因为groupingBy对分类器返回的值执行Objects.requireNonNull:

    Map<Long, List<ClaimEvent>> map = events.stream()
      .filter(event -> eventTypeIds.contains(event.getClaimEventTypeId()))
      .collect(groupingBy(ClaimEvent::getSubprocessId));

使用Optional可以:
    Map<Optional<Long>, List<ClaimEvent>> map = events.stream()
      .filter(event -> eventTypeIds.contains(event.getClaimEventTypeId()))
      .collect(groupingBy(event -> Optional.ofNullable(event.getSubprocessId())));

07-28 01:22