java stream 根据A字段,如果相等,就去一条,根据B字段取最小的一条
时间: 2024-04-22 16:26:27 浏览: 6
你可以使用Java Stream来实现根据指定字段进行分组,并获取每组中的最小元素。下面是一个示例代码,假设有一个名为`dataList`的List对象,其中包含了待处理的数据对象:
```java
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Data> dataList = List.of(
new Data("A", 1),
new Data("B", 2),
new Data("A", 3),
new Data("B", 1),
new Data("C", 5),
new Data("C", 4)
);
Map<String, Data> result = dataList.stream()
.collect(Collectors.groupingBy(Data::getFieldA,
Collectors.minBy(Comparator.comparingInt(Data::getFieldB))));
System.out.println(result);
}
static class Data {
private String fieldA;
private int fieldB;
public Data(String fieldA, int fieldB) {
this.fieldA = fieldA;
this.fieldB = fieldB;
}
public String getFieldA() {
return fieldA;
}
public int getFieldB() {
return fieldB;
}
@Override
public String toString() {
return "Data{" +
"fieldA='" + fieldA + '\'' +
", fieldB=" + fieldB +
'}';
}
}
}
```
在上述示例中,我们首先通过`Collectors.groupingBy`方法按照字段A进行分组,然后使用`Collectors.minBy`方法结合自定义的比较器`Comparator.comparingInt`,按照字段B的值进行最小值的比较。最终得到的`result`是一个Map,其中键为字段A的值,值为该分组中字段B最小的数据对象。
运行上述代码会输出以下结果:
```
{A=Data{fieldA='A', fieldB=1}, B=Data{fieldA='B', fieldB=1}, C=Data{fieldA='C', fieldB=4}}
```
其中,键为A、B、C,值为相应分组中字段B最小的数据对象。你可以根据需要进一步处理或使用这个`result`对象。