为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 8 中使用流减少 bean 列表

在 Java 8 中使用流减少 bean 列表

暮色呼如 2021-09-29 17:42:35
假设您有一个 bean 数组列表,具有几个属性:class Item {    public int id;    public String type;    public String prop1;    public String prop2;    public String prop3;}您有一个包含以下值的列表:id | type| prop1| prop2| prop31  | A   | D    | E    | F1  | B   | D    | E    | F2  | A   | G    | H    | I2  | B   | G    | H    | I2  | C   | G    | H    | I我想将其简化为包含以下内容的列表:id | type    | prop1| prop2| prop3  1  | A, B    | D    | E    | F2  | A, B, C | G    | H    | I请注意,对于相同的 id,除了类型之外,实例属性具有完全相同的值。有没有办法使用流来做到这一点?
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

首先,将集合分组Item::getId并将结果保存到Map<Integer, List<String>>. 其次,将每个条目变成一个项目并将它们收集在结果列表中。


List<Item> result = list

    .stream()

    // build a Map<Integer, List<String>>

    .collect(Collectors.groupingBy(Item::getId, Collectors.mapping(Item::getType, Collectors.toList())))

    .entrySet()

    .stream()

    // transform an entry to an item

    .map(i -> new Item(i.getKey(), String.join(", ", i.getValue().toArray(new String[0]))))

    .collect(Collectors.toList());

要清理流链,您可以在单独的方法中移动构造逻辑并使用对该方法的引用(例如map(Item::fromEntry):


public static Item fromEntry(Map.Entry<Integer, List<String>> entry) {

    return new Item(

        entry.getKey(),

        String.join(", ", entry.getValue().toArray(new String[0]))

    );

}


查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信