ski*_*iwi 12
是的,有!由于引入了Java 8方法引用,并且正如其名称所述,它们只能与方法一起使用.
请考虑以下代码:
class Person {
private String firstName;
private String lastName;
public Person(final String firstName, final String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return firstName + " " + lastName;
}
}
Run Code Online (Sandbox Code Playgroud)
假设我们想要获得一个包含按姓氏分组的人员列表的地图,我们只能通过方法参考使用以下代码来实现:
List<Person> personList = new ArrayList<>();
personList.add(new Person("Shannon", "Goldstein"));
personList.add(new Person("Donnie", "Denney"));
personList.add(new Person("Mark", "Thomas"));
personList.add(new Person("Julia", "Thomas"));
Map<String, List<Person>> personMapping = personList.stream()
.collect(Collectors.groupingBy(Person::getLastName));
System.out.println("personMapping = " + personMapping);
Run Code Online (Sandbox Code Playgroud)
打印出来,格式很好:
personMapping = {
Thomas=[Mark Thomas, Julia Thomas],
Goldstein=[Shannon Goldstein],
Denney=[Donnie Denney]
}
Run Code Online (Sandbox Code Playgroud)
如果我们使用变量,这将无法工作public,因为您无法获取它们的方法引用,也不能以其他方式引用它们,除了在不需要的地方编写完整的lambda.
(对于好奇的人:person -> person.lastName需要使用)
另外,请记住,这个答案不同于声称如果某个对象需要遵循某个接口,那么必须使用getter和setter的人.在这个示例中,Person类不遵循任何接口,但可以获得getter.