gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:08:08 25 4
gpt4 key购买 nike

我想根据 bean 类中的 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

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

最佳答案

Function 接口(interface)中有默认的 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)))

关于Java:getter 或零参数方法的功能链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65699437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com