Java:getter 或零参数方法的功能链接

Java: functional chaining of getters or zero args methods

我想基于 bean class:

中的 Enum.name() 创建 Comparator
List.of(new JobRsp(Job.MY), new JobRsp(Job.OUR), new JobRsp(Job.YOUR)).stream()
    .sorted(__ -> __.getJob().name());

如果我只需要 Enum.order() 我可以写 sorted(Job::getJob).

是否可以在 Java 中以函数式样式共同组合零参数方法?类似于:

FuncUtils.compose(Job::getJob, Enum::name)

或者可能更长:

.sort(FuncUtils.chainGetters(ObjA::getB, ObjB::getC, ObjC::getD, ObjD::getE))

虚构 chainGetters 可能会检查 nulls。

我知道 Java 不允许可变泛型,所以每个参数元数应该有 chainGetters

您在 Function 接口中有默认的 andThen 方法,可以让您链接函数。

不幸的是,没有“干净”的方法来实现结果,因为要在方法引用上调用默认方法,您需要对其进行分配或强制转换。

例如:

import static java.util.Comparator.comparing;

Function<Job, Enum> getJob = Job::getJob;
...
   .sorted(comparing(getJob.andThen(Enum::name)))

或者:

   .sorted(comparing( ((Function<Job, Enum>) Job::getJob).andThen(Enum::name) ))

因此,使用使用 Comparator.comparing 的 lambda 表达式来创建比较器更简洁:

...
   .sorted(comparing(j -> j.getJob().name()))

您建议的 compose 实用方法也可以通过以下方式实现:

public static <A, B, C>  Function<A, C> compose(Function<A, B> first, Function<B, C> second) {
    return first.andThen(second);
}

所以你可以使用:

.sorted(comparing( FuncUtils.compose(Job::getJob, Enum::name)))