java - 从具有相似属性的 List<Object> 创建 List<Set>

标签 java java-8 java-stream

class A {
  private String x;
  private String y;
  //getters and setters
}

假设我有一个类型 A 的对象列表。现在考虑一下。

A a = new A("x","something1");
A b = new A("x","something2");
A c = new A("y","something3");
A d = new A("y","something4");

List<A> aList = new ArrayList<>();

`alist` contains a, b,c ,d

我可以过滤列表并根据以下条件创建子列表列表:如果属性 x 的值相等,则将它们分组到子列表中?

所以输出应该是这样的。

List<A> someList = new ArrayList<>(); //someList contains a,b

List<A> someOtherList = new ArrayList<>(); //someOtherList contains c,d.

最终输出列表包含 someList 和 someOtherList。

最佳答案

If the value of the property x is equal group them to a sublist.

你自己说的,需要根据属性x的值对列表进行分组。使用 Stream API,这是通过使用收集器来完成的 Collectors.groupingBy(classifier) .此收集器返回一个映射,其中的条目是将给定分类器应用于 Stream 元素的结果,并将值收集到一个列表中。

Map<String, List<A>> map = aList.stream().collect(Collectors.groupingBy(A::getX));

在您的案例中,这张 map 将包含 2 个条目。第一个是指向元素 ab 的键 x;第二个是指向元素 cd 的键 y

关于java - 从具有相似属性的 List<Object> 创建 List<Set>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34588808/

相关文章:

java - 收到致命警报 : protocol_version build failure Gradle/Maven

playframework - Play 1.4.3 -- UnexpectedException : While applying class play. classloading.enhancers.LocalvariablesNamesEnhancer

java - 收集java流中字段的总和

java-8 - Java Collector.combiner 总是被供应商值调用

java - 我如何解决 MariaDB 服务器中的错误

java - 415 POST 请求中不支持的媒体类型

java - 插入另一个 IP 的命令被拒绝

java-8 - 如何使用 JavaFX 画线

java - Stream<BigDecimal> 是否有可变缩减操作(收集器)?

java.io.IOException : Server returned HTTP response code: 502 异常