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
可能会检查 null
s。
我知道 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)))
我想基于 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
可能会检查 null
s。
我知道 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)))