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

时间:2017-07-25 10:43:53

标签: java lambda java-stream comparator

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

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());
  }

编辑: 好吧,事实上,安德鲁的答案很有意思,效果很好:) 然而,鉴于评论,我真正想要的是:不要试图在方法中进行投射,而是期望演员已经在比较器中完成了

所以这会给:

  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;
                 });

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

1 个答案:

答案 0 :(得分:0)

事实上,我的问题可能是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());
 }

with和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;
           });