【发布时间】:2022-01-26 12:38:25
【问题描述】:
是否可以在 Java 中从 java.util.function.Function 返回 Comparator?
我在以下(人为设计的)示例中尝试了此操作,但 Eclipse 告诉我存在语法错误(“令牌“amountOfPages”的语法错误,删除此令牌”):
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
public class App
{
private record Book(Integer nrOfPages) {};
static Function<Integer, Comparator<Book>> byHasExactAmountOfPages = Integer amountOfPages -> (Book book1, Book book2) ->
{
if(book1.nrOfPages.equals(amountOfPages) && book2.nrOfPages.equals(amountOfPages))
{
return 0;
}
else if(!book1.nrOfPages.equals(amountOfPages) && !book2.nrOfPages.equals(amountOfPages))
{
return 0;
}
else if(book1.nrOfPages.equals(amountOfPages) && !book2.nrOfPages.equals(amountOfPages))
{
return -1;
}
else
{
return 1;
}
};
public static void main(String[] args)
{
List.of(new Book(1), new Book(2), new Book(3)).stream()
.sorted(byHasExactAmountOfPages.apply(2))
.forEach(System.out::print);
}
}
【问题讨论】:
-
一个 lambda 的 lambda 看起来令人困惑。想象一下,如果您放弃使用 Function 并只编写
static class PageCountComparator implements Comparator<Book>,并使用带有 Integer 参数的构造函数,那将会更加清晰。 (您确定要使用 Integer 而不是 int?nrOfPages 为 null 真的可以吗?) -
@VGR 感谢您的建议!我会将它们转移到我手头的实际代码中并比较两个版本:)
标签: java functional-programming comparator