在Java 8中将List <SomeObject>转换为List <AnotherObject>

时间:2019-07-08 14:33:35

标签: java list java-8 java-stream

我正在尝试将对象列表转换为对象的另一个列表。但是我试图通过java8方式来选择使用带或不带流的最佳方式,以提高可读性。

让我说一个清单如下:

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

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。

任何建议都值得赞赏和帮助。

1 个答案:

答案 0 :(得分:2)

您似乎正在根据groupingBy寻找var1,然后从mappingvar2作为值列表。可以这样做:

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());