【问题标题】:Returning a Comparator from a Function in Java从 Java 中的函数返回比较器
【发布时间】: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&lt;Book&gt;,并使用带有 Integer 参数的构造函数,那将会更加清晰。 (您确定要使用 Integer 而不是 int?nrOfPages 为 null 真的可以吗?)
  • @VGR 感谢您的建议!我会将它们转移到我手头的实际代码中并比较两个版本:)

标签: java functional-programming comparator


【解决方案1】:

你错过了参数周围的括号:

   here                   and here
    ( Integer amountOfPages ) -> (Book book1, Book book2) -> ...

【讨论】:

  • 并解释为什么(大概)@nistel 在这里感到困惑:如果您省略类型,并且只有 1 个参数,您可以省略括号:amountOfPages -&gt; (Book book1, Book book2) -&gt; ....;工作正常。但是如果你有 0 或 2+ 个参数,你想使用类型,括号是强制性的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多