首页 > 解决方案 > Java8 Streams:如何保留map之前的值以供collect / groupingBy函数访问

问题描述

我正在使用 Java8 Streams 遍历一个列表以及我调用的每个元素map,然后我需要聚合结果。我的问题是,当我打电话时,groupingBy我还需要在调用之前访问原始对象map。这是一个片段:

list.stream() //
          .filter(item -> item.getType() == HUMAN) //
          .map(item -> manager.itemToHuman(item.getId())) //
          .filter(Objects::nonNull) //
          .collect(Collectors.groupingBy(Human::getAge, Collectors.summarizingLong(item.getCount())));

问题在于调用,Collectors.summarizingLong(item.getCount())因为item此时无法访问。有没有一种优雅的方法来克服这个问题?

标签: javajava-8java-stream

解决方案


在进行map()流转换后Stream<Human>,您不能item在收集器中使用对象。

您可以转换item成一对Human对象并在收集器上count使用SimpleEntry然后使用它。

list.stream() 
    .filter(item -> item.getType() == HUMAN) 
    .map(item -> 
        new AbstractMap.SimpleEntry<>(manager.itemToHuman(item.getId()), item.getCount()))
    .filter(entry -> Objects.nonNull(entry.getKey()))
    .collect(Collectors.groupingBy(entry -> entry.getKey().getAge(), 
             Collectors.summarizingLong(Map.Entry::getValue)));

推荐阅读