如何在Java 8中使用concat获取不同的对象列表

Uma*_*ari 7 java concat distinct-values java-8 java-stream

我有2个Java类.

class A {
 String name;
 List<B> numbers;
}

class B {
 Integer number;
}
Run Code Online (Sandbox Code Playgroud)

我希望得到A类的独特之处并将其中的B列表连接起来.

例如,假设我有一个包含以下对象的List.

List<A>{
 name = "abc"
 List<B>{1,2}

 name= "xyz"
 List<B>{3,4}

 name = "abc"
 List<B>{3,5}
}
Run Code Online (Sandbox Code Playgroud)

结果应该是:

List<A>{
 name = "abc"
 List<B>{1,2,3,5}

 name="xyz"
 List<B>{3,4}
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

注意:我想使用Java 8流实现此功能.

谢谢

Tag*_*eev 3

您可以使用toMap收集器:

Collection<A> result = list.stream()
         .collect(Collectors.toMap(a -> a.name, a -> a, 
                      (a, b) -> {a.numbers.addAll(b.numbers); return a;}))
         .values();
Run Code Online (Sandbox Code Playgroud)

您可以将之后的结果复制到List(like new ArrayList<>(result)) 中,但由于我们不保留任何特定顺序,因此具有List并不是很有用。在大多数情况下,有Collection这样的结果就很好。

  • 您可以通过使用“toMap()”的四参数重载并将“LinkedHashMap::new”作为“Supplier”传递来保留顺序。 (3认同)