java - 通过 Java-8 中的公共(public)字段减少对象集合

标签 java lambda java-8 java-stream

我有一个对象列表 Ob 定义为

class Ob {
   private String type;
   private List<String> attire;
   // standard getter and setters

   public Ob (String type){
        this.type=type;
    }

    public Ob addAttrire(String att){
        if(attire == null){
            attire = new ArrayList<>();
        }
        attire.add(att);
        return this;
    }
}

我接收对象为

[{
"type" : "upper"
attires : [{"t1","t2"}]
},
{
"type" : "upper"
attires : ["t3","t4"]
},
{
"type" : "lower"
attires : ["l1","l2"]
}]

我必须合并为

[{
"type" : "upper"
attires : ["t1","t2","t3","t4"]
},{
"type" : "lower"
attires : ["l1","l2"]
}]

我如何使用流来做到这一点。减少有帮助吗? 可以使用的流是

List<Ob> coll = new ArrayList<>();


 coll.add(new Ob("a").addAttrire("1").addAttrire("2").addAttrire("3"));
        coll.add(new Ob("a").addAttrire("1").addAttrire("2").addAttrire("3"));
        coll.add(new Ob("a").addAttrire("1").addAttrire("2").addAttrire("3"));
        coll.add(new Ob("b").addAttrire("1").addAttrire("2").addAttrire("3"));
        coll.add(new Ob("b").addAttrire("1").addAttrire("2").addAttrire("3"));
        coll.add(new Ob("b").addAttrire("1").addAttrire("2").addAttrire("3"));



Collection<Ob> values = coll.stream()
                .collect(toMap(Ob::getType, Function.identity(), (o1, o2) -> {
                    o1.getAttire().addAll(o2.getAttire());
                    return o1;
                })).values();

用 Ruben 的解决方案更新了问题。不需要删除重复项,但可以使用 Ob 中的 set 来完成。当前的解决方案完美无缺。

最佳答案

您可以使用合并列表的合并函数来收集 toMap

    Collection<Ob> values = coll.stream()
     .collect(toMap(Ob::getType, Function.identity(), (o1, o2) -> {
        o1.getAttire().addAll(o2.getAttire());
        return o1;
    })).values();

关于java - 通过 Java-8 中的公共(public)字段减少对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32893360/

相关文章:

java - 如何更改计时器/线程的延迟

java - 无法上传大文件

java - 将 arraylist 划分为 Map 存储桶

java - java编译器是否将Function<Double,Integer>转换为DoubleToIntFunction?

java - "Double"与 CompletableFuture 的组合

java - 如何使用 java 8 lambda 创建内部成员列表?

java - 在 Java 中将名称格式从 "Last, First MI."更改为 "First MI. Last"

java - 解析EVA格式的数据

Java Lambda 方法引用不起作用

Java 8 - 如何访问封装为 lambda 的对象和方法