Java中如何通过传入分类器函数实现多规则数据分组?
可行!通用分组方法实现方案
当然可行,你只需要将通用分组方法的分类器参数明确为Function<? super Data, ? extends KeyGroup>类型,再通过Lambda表达式定义不同规则的分类器,就能适配多种分组场景。
1. 修正通用分组方法
原期望的通用方法存在语法错误(多余闭合括号)且参数未声明类型,修正后的代码如下:
import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public Map<KeyGroup, List<Data>> groupData(List<Data> data, Function<? super Data, ? extends KeyGroup> classifier) { return data .stream() .collect(Collectors.groupingBy(classifier)); }
2. 声明不同规则的分类器
直接用Lambda表达式实现两个分类器,完全对应原有的两种分组逻辑:
// 对应groupData1的规则:按code、startDate、endDate组合分组 Function<? super Data, ? extends KeyGroup> classifier1 = d -> new KeyGroup(d.getCode(), d.getStartDate(), d.getEndDate()); // 对应groupData2的规则:仅按code分组 Function<? super Data, ? extends KeyGroup> classifier2 = d -> new KeyGroup(d.getCode());
3. 调用示例
// 假设已有data1、data2两个List<Data>实例 Map<KeyGroup, List<Data>> groupedData1 = groupData(data1, classifier1); Map<KeyGroup, List<Data>> groupedData2 = groupData(data2, classifier2);
额外优化建议(可选)
为避免后续修改KeyGroup的keys导致分组逻辑混乱,建议将KeyGroup的keys改为不可变集合,并移除setKeys方法,增强分组的稳定性:
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; public class KeyGroup { private final List<Object> keys; public KeyGroup(Object... keys) { this.keys = Collections.unmodifiableList(List.of(keys)); } public KeyGroup(List<Object> keys) { this.keys = Collections.unmodifiableList(new ArrayList<>(keys)); } public List<Object> getKeys() { return keys; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof KeyGroup)) return false; KeyGroup keyGroup = (KeyGroup) o; return keys.equals(keyGroup.keys); } @Override public int hashCode() { return Objects.hash(keys); } }
内容的提问来源于stack exchange,提问作者user3072470
相关产品推荐
相关产品推荐

