java stream 根据A字段,如果相等,就去一条,根据B字段取最小的一条,C字段等于True
时间: 2024-04-22 14:26:27 浏览: 55
Java8进行多个字段分组统计的实例代码
如果你想使用Java Stream根据字段A进行分组,并且在每个分组中选择字段B最小的一条记录,并且字段C等于True,你可以使用Java Stream的过滤和收集操作来实现。以下是一个示例代码:
```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, true),
new Data("B", 2, false),
new Data("A", 3, true),
new Data("B", 1, true),
new Data("C", 5, true),
new Data("C", 4, false)
);
Map<String, Data> result = dataList.stream()
.filter(data -> data.isFieldC())
.collect(Collectors.groupingBy(Data::getFieldA,
Collectors.collectingAndThen(
Collectors.minBy(Comparator.comparingInt(Data::getFieldB)),
Optional -> Optional.orElse(null)
)));
System.out.println(result);
}
static class Data {
private String fieldA;
private int fieldB;
private boolean fieldC;
public Data(String fieldA, int fieldB, boolean fieldC) {
this.fieldA = fieldA;
this.fieldB = fieldB;
this.fieldC = fieldC;
}
public String getFieldA() {
return fieldA;
}
public int getFieldB() {
return fieldB;
}
public boolean isFieldC() {
return fieldC;
}
@Override
public String toString() {
return "Data{" +
"fieldA='" + fieldA + '\'' +
", fieldB=" + fieldB +
", fieldC=" + fieldC +
'}';
}
}
}
```
在上面的代码中,我们首先使用`filter`方法过滤出字段C等于True的数据,然后使用`Collectors.groupingBy`方法按照字段A进行分组,并结合`Collectors.collectingAndThen`方法和`Collectors.minBy`方法,选择每个分组中字段B最小的数据对象。最终得到的`result`是一个Map,其中键为字段A的值,值为满足条件的分组中字段B最小的数据对象。
运行上述代码会输出以下结果:
```
{A=Data{fieldA='A', fieldB=1, fieldC=true}, C=Data{fieldA='C', fieldB=4, fieldC=true}}
```
其中,键为A、C,值为满足条件的分组中字段B最小的数据对象。
注意:示例代码中使用了一个名为`Data`的内部类来表示数据对象,其中包含了字段A、B和C以及相应的getter方法。你可以根据实际情况进行调整和修改。
阅读全文