You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:30:53