在Java 8中,“特定类型的任意对象”是什么意思?
在Java 8中,有“方法参考”function。 其中一种是“引用特定类型的任意对象的实例方法”
http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type
有人可以解释“特定类型的任意对象”在该背景下的含义吗?
它是对某种类型的实例方法的引用。 在示例的情况下, compareToIgnoreCase
是String
的方法。 程序知道它可以在String
实例上调用此方法,因此它可以获取该类型的引用和任何对象,并保证该方法存在。
我会将它与Method
类进行比较,因为它们引用了一个方法,并且可以在某种类型的任意实例上调用它。
例如,它可以使用两个String
对象并在一个上调用compareToIgnoreCase
,并使用另一个作为参数来匹配方法签名。 这允许它根据数组类型的任何方法获取数组并对其进行排序,而不是需要比较器实例来执行此操作。
以下是未点击问题链接的任何人的示例:
String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda", "George" }; Arrays.sort(stringArray, String::compareToIgnoreCase);
Oracle Doc链接的示例是:
String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" }; Arrays.sort(stringArray, String::compareToIgnoreCase);
lambda相当于
String::compareToIgnoreCase
将会
(String a, String b) -> a.compareToIgnoreCase(b)
Arrays.sort()
方法正在寻找比较器作为其第二个参数(在本例中)。 传递String::compareToIgnoreCase
创建一个比较器,其中包含a.compareToIgnoreCase(b)
作为比较方法的主体。 然后你问好了什么是a
和b
。 比较方法的第一个参数变为a
和第二个b
。 这些是String类型(特定类型)的任意对象。
不明白?
- 确保您知道比较器是什么以及如何实现它 。
- 了解function界面是什么以及它如何影响Java中的lambdas。
- 比较器是一个function接口 ,这就是方法引用成为比较器对象内部比较方法体的原因。
- 阅读下面的源代码 ,了解页面底部的另一个示例 。
阅读更多资料来源: http : //moandjiezana.com/blog/2014/understanding-method-references/
请参阅以下代码示例,其中解释了https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html中描述的“对特定类型的任意对象的实例方法的引用”类别
import java.util.Arrays; class Person{ String name; //constructor public Person(String name){ this.name = name; } //instance method 1 public int personInstanceMethod1(Person person){ return this.name.compareTo(person.name); } //instance method 2 public int personInstanceMethod2(Person person1, Person person2){ return person1.name.compareTo(person2.name); } } class Test { public static void main (String[] args) throws Exception{ Person[] personArray = {new Person("A"), new Person("B")}; // Scenario 1 : Getting compiled successfully Arrays.sort(personArray, Person::personInstanceMethod1); // Scenario 2 : Compile failure Arrays.sort(personArray, Person::personInstanceMethod2); // Scenario 3 : Getting compiled successfully. Person personInstance = new Person("C"); Arrays.sort(personArray, personInstance::personInstanceMethod2); // Scenario 4 : Getting compiled successfully. As the same way as "Scenario 1" String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" }; Arrays.sort(stringArray, String::compareToIgnoreCase); } }
场景1和场景4描述了https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html中描述的“对特定类型的任意对象的实例方法的引用”类别
如果method参数在同一实例中获取变量Type作为元素的实例Type,则可以使用Type调用该实例方法。(Person :: personInstanceMethod1)
将“Person”类中的“personInstanceMethod1”实例方法与“String”类中的“compareToIgnoreCase”实例方法进行比较( https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareToIgnoreCase -java.lang.String- )查看相似度。 两者都采用相同类型的单个参数。
比较场景1和场景2以查看差异。
在这种情况下,存在特定类型(String)的对象数组,并且数组中的任何随机对象都可以调用其实例方法。 此方法允许类引用其实例方法,就好像它是静态方法一样。
此方法也适用于类似于String的内置类,但不适用于用户定义的类。 在用户定义的类的情况下,实例方法只能由其对象引用。