如何将Function<T,R>作为方法参数实现水泵列表排序
Java Lambda多维度排序实现指导
问题背景
我正在学校学习Java Lambda,卡壳好几天了。需求是对水泵列表按功率、上次修订时间等维度排序,已经写了几个实现Comparator<Pomp>的类,现在需要实现一个返回List<Pomp>的sortedBy方法,方法签名固定:
public List<Pomp> sortedBy(Function<Pomp, Comparable<? super Comparable>> function)
现有Comparator实现
class PowerComparator implements Comparator<Pomp> { @Override public int compare(Pomp pump1 , Pomp pump2) { return Double.compare(pump1.getPower(), pump2.getPower()); } }
另外还有同类型的维度Comparator:
class VermogenComparator implements Comparator<Pomp> { @Override public int compare(Pomp pomp1 , Pomp pomp2) { return Double.compare(pomp1.getVermogen(), pomp2.getVermogen()); } } class RevisieComparator implements Comparator<Pomp> { @Override public int compare(Pomp pomp1 , Pomp pomp2) { return pomp1.getLaatsteRevisie().compareTo(pomp2.getLaatsteRevisie()); } } class Zelfontbranding implements Comparator<Pomp> { @Override public int compare(Pomp pomp1 , Pomp pomp2) { return Boolean.compare(pomp1.getBovenZelfOntbranding(), pomp2.getBovenZelfOntbranding()); } }
错误代码示例
我尝试编写的sortedBy方法存在多处问题:
public List<Pomp> sortedBy(Function<Pomp, Comparable<Pomp>> function){ List<Pomp> sortBy = new ArrayList<Pomp>(pumps); function.apply((Pump) ->Comparator.comparing(pumps::comparator)); Collections.sort(sortBy, Comparator.comparing(function.apply(pumps); return sortBy; }
补充数据代码
public class Data { private static List<Pomp> data; public static List<Pomp> getData() { data = new ArrayList<>(); data.add(new Pomp("J6706A", 100.0, 2, Aandrijving.TURBINE, LocalDate.of(2022, 1, 10), true, 500.0, "Slurry pomp")); data.add(new Pomp("J6707A", 55.5, 1, Aandrijving.MOTOR, LocalDate.of(2022, 2, 10), false, 500.0, "Clarified pomp")); data.add(new Pomp("J6706B", 100.0, 2, Aandrijving.TURBINE, LocalDate.of(2022, 3, 10), true, 500.0, "Slurry pomp")); data.add(new Pomp("J6706C", 100.0, 2, Aandrijving.TURBINE, LocalDate.of(2022, 4, 10), true, 500.0, "Slurry pomp")); data.add(new Pomp("J6705A", 62, 1, Aandrijving.MOTOR, LocalDate.of(2022, 5, 10), false, 250, "Voedings pomp")); data.add(new Pomp("J6705B", 35, 2, Aandrijving.TURBINE, LocalDate.of(2022, 6, 10), false, 150, "Voedings pomp")); data.add(new Pomp("J6708B", 100.0, 2, Aandrijving.TURBINE, LocalDate.of(2022, 7, 10), false, 300, "HCO circ pomp")); return data; } } public class Pompen { private TreeSet<Pomp> pompen = new TreeSet<>(); public void add(Pomp pomp) { pompen.add(pomp); } // 上述Comparator类定义在此类内部 }
正确实现方案
1. 修正方法签名泛型
原方法签名的泛型约束错误,排序字段(Double、LocalDate、Boolean等)是Comparable的子类,但不是Comparable<Pomp>。正确签名应为:
public List<Pomp> sortedBy(Function<Pomp, ? extends Comparable<?>> function)
2. 实现sortedBy方法
利用Comparator.comparing直接接收传入的Function生成排序器,完成列表排序:
public List<Pomp> sortedBy(Function<Pomp, ? extends Comparable<?>> function) { List<Pomp> sortedList = new ArrayList<>(pompen); // 对应类中存储水泵的TreeSet变量pompen sortedList.sort(Comparator.comparing(function)); return sortedList; }
3. 调用示例
通过方法引用直接传入排序维度:
Pompen pompen = new Pompen(); // 先将数据导入pompen集合 for (Pomp p : Data.getData()) { pompen.add(p); } // 按功率排序 List<Pomp> sortedByPower = pompen.sortedBy(Pomp::getVermogen); // 按上次修订时间排序 List<Pomp> sortedByRevision = pompen.sortedBy(Pomp::getLaatsteRevisie); // 按自启动状态排序 List<Pomp> sortedBySelfIgnition = pompen.sortedBy(Pomp::getBovenZelfOntbranding);
4. 多维度排序扩展
若需要组合多个维度排序(比如先按功率,再按修订时间),可扩展方法支持多Function参数:
public List<Pomp> sortedBy(List<Function<Pomp, ? extends Comparable<?>>> functions) { List<Pomp> sortedList = new ArrayList<>(pompen); Comparator<Pomp> comparator = Comparator.comparing(functions.get(0)); for (int i = 1; i < functions.size(); i++) { comparator = comparator.thenComparing(functions.get(i)); } sortedList.sort(comparator); return sortedList; } // 调用示例:先按功率,再按修订时间 List<Function<Pomp, ? extends Comparable<?>>> sortKeys = Arrays.asList( Pomp::getVermogen, Pomp::getLaatsteRevisie ); List<Pomp> sortedList = pompen.sortedBy(sortKeys);
错误代码问题分析
function.apply((Pump) ->Comparator.comparing(pumps::comparator)):apply需要传入Pomp实例,而非Lambda表达式,逻辑完全错误。Collections.sort(sortBy, Comparator.comparing(function.apply(pumps);:语法错误,function.apply(pumps)返回的是单个Comparable值,而Comparator.comparing需要的是Function类型参数。- 变量名不匹配:类中存储水泵的是
pompen而非pumps,需对应正确变量名。
内容的提问来源于stack exchange,提问作者S.Cl
相关产品推荐
相关产品推荐

