LIst<T> 根据其中的一个属性分组Stream ,分完组,将某个属性相同的值进行计算
时间: 2024-01-21 21:16:42 浏览: 151
根据某个属性对List中的所有对象分组,该属性值相同的对象分到一个组
可以使用 Java 8 中的 Stream API 来实现。假设你有一个 `List` 对象 `list`,其中的元素类型为 `T`,它有一个属性 `property`,你想要按照该属性进行分组,并对每个分组中的元素进行某种计算,可以按照以下步骤操作:
1. 使用 `Collectors.groupingBy()` 方法将元素按照属性分组,得到一个 `Map` 对象,其中键为属性值,值为该属性值对应的元素列表。
```java
Map<PropertyType, List<T>> groups = list.stream().collect(Collectors.groupingBy(T::getProperty));
```
这里假设 `T::getProperty` 是一个获取属性值的方法引用,`PropertyType` 是属性值的类型。
2. 对于每个分组,使用 `Stream.mapToXxx()` 方法将元素转换为某个类型的数值,并使用 `Stream.reduce()` 方法计算它们的和、平均值等等。例如,如果你想要计算每个分组中元素的 `value` 属性之和,可以这样:
```java
Map<PropertyType, Integer> sums = groups.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().stream().mapToInt(T::getValue).sum()));
```
这里假设 `T::getValue` 是一个获取数值属性值的方法引用。
完整示例代码如下:
```java
import java.util.*;
import java.util.stream.Collectors;
public class GroupAndCalculate {
public static void main(String[] args) {
List<Item> items = Arrays.asList(
new Item("apple", 10),
new Item("banana", 20),
new Item("apple", 30),
new Item("banana", 40),
new Item("orange", 50)
);
Map<String, List<Item>> groups = items.stream().collect(Collectors.groupingBy(Item::getName));
System.out.println(groups);
Map<String, Integer> sums = groups.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().stream().mapToInt(Item::getValue).sum()));
System.out.println(sums);
}
static class Item {
private final String name;
private final int value;
public Item(String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public int getValue() {
return value;
}
@Override
public String toString() {
return String.format("%s:%d", name, value);
}
}
}
```
输出结果:
```
{orange=[orange:50], banana=[banana:20, banana:40], apple=[apple:10, apple:30]}
{orange=50, banana=60, apple=40}
```
其中第一个 `Map` 对象表示按照 `name` 属性分组后的结果,第二个 `Map` 对象表示每个分组中 `value` 属性值之和的计算结果。
阅读全文