【发布时间】:2018-03-02 20:52:12
【问题描述】:
我有这段代码,我尝试将方法引用 ("String::length") 转换为等效的 lambda 表达式。
Stream<String> s = Stream.of("hello", "your name", "welcome", "z");
List<String> list = s.sorted((a, b) -> Comparator.comparingInt(String::length).compare(a, b)).collect(toList());
// List<String> list = s.sorted((a, b) -> Comparator.comparingInt( p -> {return ((String)p).length();}).compare(a, b)).collect(toList());
注释行中概述了它的唯一工作方式。我需要转换参数“p”。
似乎在编译时它指定参数“p”的类型是一个对象,如果我使用 lambda 表达式并且我需要显式转换。见下文:
<Object> Comparator<Object> java.util.Comparator.comparingInt(ToIntFunction<? super Object> keyExtractor)
当我使用 String::length 方法引用时,在编译时隐式参数被正确理解为 String 实例。在这种情况下有什么特别之处?见下文。
<String> Comparator<String> java.util.Comparator.comparingInt(ToIntFunction<? super String> keyExtractor)
【问题讨论】:
-
这也应该有效(没有演员表):
(String p) -> p.length(). -
(a, b) -> Comparator.comparingInt(String::length).compare(a, b)=Comparator.comparingInt(String::length)::compare=Comparator.comparingInt(String::length) -
我认为 OP 的问题是为什么在
p -> p.length()中,p变量不会被 Java 编译器识别为String。 -
@tsolakp:是的,你是对的。
-
@Khanna11。我认为这是因为对
comparingInt的调用没有指定将传递给它的类型,默认情况下它假定一个对象。要给编译器一个提示,你需要使用方法参考、我之前注释过的语法或者这个:Comparator.<String>comparingInt( p -> p.length() ).
标签: java sorting compiler-errors java-8 comparator