使用 Lambda 传递和转换 Comparator 作为方法的参数

Posted

技术标签:

【中文标题】使用 Lambda 传递和转换 Comparator 作为方法的参数【英文标题】:Passing and casting a Comparator as argument of method using Lambdas 【发布时间】:2017-12-31 05:49:20 【问题描述】:

如何创建一个可以接受带有通配符的比较器作为参数的方法,然后捕获类并使用比较器?

public List<String> myFilter(Comparator<?> comp, Object value, Class c)
   return myList.stream()
         .filter(s->
              comp.compare(c.cast(s), c.cast(value))>=0
          ).collect(toList());
  

编辑: 好的,事实上,安德鲁的回答很有趣,而且效果很好:) 然而,考虑到 cmets,我真正想要的是:与其尝试在方法中进行转换,不如期望转换已经在比较器中完成

所以这会给出:

  public List<String> filter(Comparator<String> comp)
         return myList.filter(s->comp.compare(s, null)>=0).collect(toList());
   

调用它时,应该是这样的

   List<String> myNewList= filter((String s1, String s2)->
                  try
                      int i=Integer.parseInt(s1);
                      return Integer.compare(i, myRealCompareValue);
                 catch(Exception e)
                      e.printStackTrace();
                     return null;
                 );

虽然看起来不太好看....

【问题讨论】:

myList的类型是什么,如何声明? 你不能。要么是比较器的类型正确,要么如果没有未经检查的操作就无法使用它。 字符串。它在我的类的构造函数中声明,它也接受 List 作为参数。 @Myoch 那你为什么不用Comparator&lt;String&gt;呢? @talex 因为列表可以包含数字(如果是,所有元素都是数字)。 【参考方案1】:

事实上,我的问题可能与How do I define a method which takes a lambda as a parameter in Java 8?重复

而我真正想做的是

 public List<String> myFilter(MyComparator c)
        return myList
           .stream()
           .filter(c::compare)
           .collect(toList());
 

使用和接口 MyComparator:

  public interface MyComparator
        public boolean compare(String s);
  

然后可以这样调用:

   List<String> myNewList=filter((String s)->s.compareTo(whateverString)>=0);

甚至:

   List<String> myNewList=filter((String s)->
           try
               return Integer.compare(Integer.parseInt(s), 10)>=0;
           catch(Exception e)
               return false;
           );

【讨论】:

以上是关于使用 Lambda 传递和转换 Comparator 作为方法的参数的主要内容,如果未能解决你的问题,请参考以下文章

传递给模板函数时,lambda自动衰减到函数指针

将模板函数转换为通用 lambda

如何传递和使用任意lambda函数作为参数[重复]

如何通过一系列 lambdas 传递数据,其中参数类型是根据前一个 lambda 的返回类型推断的?

如何在 lambda 方法中传递参数和 async 关键字?

理解 python 中的 lambda 并使用它来传递多个参数