Tag: 方法引用

为什么Comparator.comparing不能与String :: toLowerCase方法引用一起使用?

我试图通过逆序(忽略大小写)排序一个字符串数组,而不修改它,只打印它。 所以我使用的是Java8流。 但我无法做到这一点。 这是我的尝试: package experimentations.chapter02; import java.util.Arrays; import java.util.Comparator; import java.util.stream.Collectors; public class StringStream { public static void main(String[] args) { sortStrings(); } public static void sortStrings(){ String[] stringsArray = “The quick brown fox has a dirty ladder”.split(“\\s+”); System.out.println( Arrays.stream(stringsArray) .sorted(Comparator.comparing(String::toLowerCase).reversed()) .collect(Collectors.toList()) ); } } 这里的问题是静态方法Comparator.comparing不接受String::toLowerCase 。 同时,我设法对数组进行排序,但修改它: public static void sortStrings(){ String[] stringsArray […]

为什么必须为方法引用显式指定类/对象名?

当我想引用当前作用域中的方法时,我仍然需要在:: operator之前指定类名(对于静态方法)。 例如,我需要写: import java.util.stream.Stream; public class StreamTest { public static int trimmedLength(String s) { return s.trim().length(); } public static void main(String[] args) { System.out.println(Stream.of(” aaa “, ” bb “, ” c “) .mapToInt(StreamTest::trimmedLength).sum()); } } 这不是一个大问题,但有时看起来过于拥挤静态方法,因为类名可能很长。 如果编译器允许我简单地编写::trimmedLength那将是很好的: public static void main(String[] args) { System.out.println(Stream.of(” aaa “, ” bb “, ” c “) .mapToInt(::trimmedLength).sum()); } […]

在Java 8中,“特定类型的任意对象”是什么意思?

在Java 8中,有“方法参考”function。 其中一种是“引用特定类型的任意对象的实例方法” http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type 有人可以解释“特定类型的任意对象”在该背景下的含义吗?

在Java8中引用具有不同参数的方法

我想知道所有这些方法引用和function接口如何在较低级别上工作。 最简单的例子是我们有一些List List list = new ArrayList(); list.add(“b”); list.add(“a”); list.add(“c”): 现在我们想用Collections类对它进行排序,所以我们可以调用: Collections.sort(list, String::compareToIgnoreCase); 但是,如果我们定义自定义比较器,它可能是这样的: Comparator customComp = new MyCustomOrderComparator(); Collections.sort(list, customComp::compare); 问题是Collections.sort有两个参数:List和Comparator。 由于Comparator是function接口,因此可以使用具有相同签名(参数和返回类型)的lambda表达式或方法引用替换它。 那么它如何工作我们可以传递也引用compareTo只接受一个参数并且这些方法的签名不匹配? 如何在Java8中翻译方法引用?