【问题标题】:Java Stream mapping and groupingby field that no longer exists after map [duplicate]映射后不再存在的Java Stream映射和分组字段[重复]
【发布时间】:2021-05-07 20:41:51
【问题描述】:

我将举一个我需要的小例子。我有这个简单的豆子:

public class Item {
   
    private String name;
    private String code;
    private Category category;
   
   //getters and setters omitted for brevity
}

public class SimpleItem {
   
    private String name;
    private String code;
   
   //getters and setters omitted for brevity
}

我需要将Collection<Item> 映射和分组到Map<Category,List<SimpleItem>>。我试过这样的事情

public class itemMapper {

    public Map<Category,List<SimpleItem>> map(Collection<Item> items){
        return items.stream()
                    .map(this::mapToSimpleItem)
                    .collect(groupingBy(Item::getCategory));
    }
    
    private SimpleItem mapToSimpleItem(Item item){
        //
    }
    
}

问题是映射后,字段类别不再存在。有什么想法吗?

【问题讨论】:

  • 你使用的是.map(this::mapToSimpleItem),所以在收集部分你有一个Stream&lt;SimpleItem&gt;而不是Stream&lt;Item&gt;
  • OP知道,OP基本上是在问如何分组然后映射,第一个答案解释了这一点。

标签: java collections stream java-stream groupingby


【解决方案1】:

要获得你想要的,你需要在收集之前使用groupingBymapping 而不是map,因为正如我在评论中所说,.map(this::mapToSimpleItem) 返回Stream&lt;SimpleItem&gt; 而不是Stream&lt;Item&gt;,你的代码应该是:

return items.stream()
        .collect(groupingBy(Item::getCategory, 
                mapping(this::mapToSimpleItem, Collectors.toList())));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2014-10-13
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多