首页 > 解决方案 > 转换列表列表在 Java 8 中

问题描述

我正在尝试将对象列表转换为另一个对象列表。但是我正在尝试通过 java8 方式选择使用有或没有流的最佳方式,并具有更高的可读性。

可以说我有一个如下列表:

List<SomeObject> list = new ArrayList<SomeObject>;

一些对象:

public class SomeObject{
  private String var1;
  private String var2;
  private String var3;
  private String var4;
  //getters and setters
}

另一个对象:

public class AnotherObject{
  private String var1;
  private List<String> var2;
  //getters and setters
}

但是在另一个对象中,如果多个对象的 var1 相同,我想将 var2 值保存在 String 列表中。下面的示例:

SomeObject so = new SomeObject();
so.setVar1("key1");
so.setVar2("value1");
SomeObject so1 = new SomeObject();
so1.setVar1("key2");
so1.setVar2("value2"); 
SomeObject so2 = new SomeObject();
so2.setVar1("key2");
so2.setVar2("value3");    
list.add(so);
list.add(so1);
list.add(so2);

现在从上面的列表中,我想创建只有 var1 和 var2 的 AnotherObject 列表,如果两个 SoemObject 中的 var1 相同,那么我想要列表中的 var2 值并将其保存为 var1。

任何建议都会受到赞赏和帮助。

标签: javalistjava-8java-stream

解决方案


您似乎正在寻找groupingBy基于var1然后mappingtovar2作为值列表。这可以这样做:

List<AnotherObject> anotherList = list.stream()
        .collect(Collectors.groupingBy(
                SomeObject::getVar1, Collectors.mapping(
                        SomeObject::getVar2, Collectors.toList())))
        .entrySet().stream()
        .map(e -> new AnotherObject(e.getKey(), e.getValue()))
        .collect(Collectors.toList());

推荐阅读