结果
记录一下stream流的使用心得,一共写了两种方式。第一种用stream流的Collectors的groupby()。第二种是Collections的map()。贴代码,第一段是代码,第二段是结果
package com.huang.grpceasy;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
class OverhaulTaskDo {
private int id;
private Integer nodeWindowStart;
private Integer nodeWindowEnd;
public OverhaulTaskDo(int id, Integer nodeWindowStart, Integer nodeWindowEnd) {
this.id = id;
this.nodeWindowStart = nodeWindowStart;
this.nodeWindowEnd = nodeWindowEnd;
}
public int getId() {
return id;
}
public Integer getNodeWindowStart() {
return nodeWindowStart;
}
public Integer getNodeWindowEnd() {
return nodeWindowEnd;
}
}
class OverhaulTaskVo {
private Integer nodeWindowStart;
private Integer nodeWindowEnd;
public OverhaulTaskVo(Integer nodeWindowStart, Integer nodeWindowEnd) {
this.nodeWindowStart = nodeWindowStart;
this.nodeWindowEnd = nodeWindowEnd;
}
public Integer getNodeWindowStart() {
return nodeWindowStart;
}
public Integer getNodeWindowEnd() {
return nodeWindowEnd;
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
OverhaulTaskVo that = (OverhaulTaskVo) o;
return Objects.equals(nodeWindowStart, that.nodeWindowStart) && Objects.equals(nodeWindowEnd, that.nodeWindowEnd);
}
@Override
public int hashCode() {
return Objects.hash(nodeWindowStart, nodeWindowEnd);
}
@Override
public String toString() {
return "OverhaulTaskVo{" +
"nodeWindowStart=" + nodeWindowStart +
", nodeWindowEnd=" + nodeWindowEnd +
'}';
}
}
public class Main {
public static void main(String[] args) {
List<OverhaulTaskDo> overhaulTaskDoList = new ArrayList<>();
overhaulTaskDoList.add(new OverhaulTaskDo(1, 1, 2));
overhaulTaskDoList.add(new OverhaulTaskDo(2, 2, 2));
overhaulTaskDoList.add(new OverhaulTaskDo(3, null, null));
overhaulTaskDoList.add(new OverhaulTaskDo(4, 1, 2));
overhaulTaskDoList.add(new OverhaulTaskDo(5, 3, 4));
overhaulTaskDoList.add(new OverhaulTaskDo(6, 2, 2));
// 使用 Stream 流筛选掉空数据并合并节点窗口起终点相同的数据,然后List<OverhaulTaskDo> overhaulTaskDoList转换为List<OverhaulTaskVo>
List<OverhaulTaskVo> collect = overhaulTaskDoList.stream()
.filter(taskDo -> Optional.ofNullable(taskDo.getNodeWindowStart()).isPresent() && Optional.ofNullable(taskDo.getNodeWindowEnd()).isPresent() )
//方式一:
// 筛选掉空数据
// .collect(Collectors.groupingBy(
// task -> task.getNodeWindowStart() + "-" + task.getNodeWindowEnd(),
// Collectors.collectingAndThen(Collectors.toList(), list -> {
// // 只需要合并后的第一个对象即可
// OverhaulTaskDo firstTask = list.get(0);
// return new OverhaulTaskVo(firstTask.getNodeWindowStart(), firstTask.getNodeWindowEnd());
// })
// )).values().stream()
// .collect(Collectors.toList());
//方式二:
.collect(Collectors.toMap(
task -> task.getNodeWindowStart() + "-" + task.getNodeWindowEnd(),
task -> task,
(existing, replacement) -> existing // 合并逻辑,保留已存在的对象
)).values().stream()
.map(task -> new OverhaulTaskVo(task.getNodeWindowStart(), task.getNodeWindowEnd()))
.collect(Collectors.toList());
System.out.println("合并后的数据:"+collect);
for (OverhaulTaskVo taskDo : collect) {
System.out.println("Node Window Start: " + taskDo.getNodeWindowStart() + ", Node Window End: " + taskDo.getNodeWindowEnd());
}
}}
合并后的数据:[OverhaulTaskVo{nodeWindowStart=1, nodeWindowEnd=2}, OverhaulTaskVo{nodeWindowStart=2, nodeWindowEnd=2}, OverhaulTaskVo{nodeWindowStart=3, nodeWindowEnd=4}]
Node Window Start: 1, Node Window End: 2
Node Window Start: 2, Node Window End: 2
Node Window Start: 3, Node Window End: 4