【问题标题】:Convert a List<SomeObject> toList<AnotherObject> in java 8在 java 8 中将 List<SomeObject> 转换为List<AnotherObject>
【发布时间】:2019-07-08 14:33:35
【问题描述】:

我正在尝试将一个对象列表转换为另一个对象列表。但我正在尝试通过 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 值保存在字符串列表中。示例如下:

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。

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

【问题讨论】:

  • IMO 你不需要创建新对象!(AnotherObject)。你为什么不使用Map&lt;String,List&lt;String&gt;&gt; 在这种情况下你可以有简单的方法。 list.stream() .collect(Collectors.groupingBy(SomeObject::getVar1, Collectors.mapping(SomeObject::getVar2, Collectors.toList())));
  • @HadiJ 我目前正在使用地图。但我想使用一个对象,考虑到未来可能会有增强,如果我们将它用作对象,这可能会变得容易。感谢您的回复:)

标签: java list java-8 java-stream


【解决方案1】:

您似乎正在寻找基于var1groupingBy,然后是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());

【讨论】:

  • 没关系。完美,这就是我要找的。谢谢!
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2021-07-16
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多