使用 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
的类型是什么,如何声明?
你不能。要么是比较器的类型正确,要么如果没有未经检查的操作就无法使用它。
字符串。它在我的类的构造函数中声明,它也接受 ListComparator<String>
呢?
@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 作为方法的参数的主要内容,如果未能解决你的问题,请参考以下文章
如何通过一系列 lambdas 传递数据,其中参数类型是根据前一个 lambda 的返回类型推断的?