自Java8以来,是否有新的参数可以使用getter和setter?
正如标题所说,关于任何编程语言中的getter和setter都有很多讨论,Java也是如此 问题是:自从Java8发布以来,有没有新的论据自Java8以来,是否有新的参数可以使用getter和setter?,java,oop,getter,java-8,Java,Oop,Getter,Java 8,正如标题所说,关于任何编程语言中的getter和setter都有很多讨论,Java也是如此 问题是:自从Java8发布以来,有没有新的论据 一个已经存在的参数的例子是getter和setter封装了状态,或者它们可以在不更改API的情况下更改实现。是的,有!由于引入了Java8方法引用,正如其名称所示,它们只能与方法一起使用 考虑以下代码: class Person { private String firstName; private String lastName;
一个已经存在的参数的例子是getter和setter封装了状态,或者它们可以在不更改API的情况下更改实现。是的,有!由于引入了Java8方法引用,正如其名称所示,它们只能与方法一起使用 考虑以下代码:
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;
}
}
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);
假设我们想要获得一个包含按姓氏分组的人员列表的地图,我们只能通过使用以下代码的方法引用来实现这一点:
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;
}
}
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);
如果我们使用的是public
变量,这将不起作用,因为您无法获得对它们的方法引用,也无法以其他方式引用它们,除非在不需要的地方编写一个完整的lambda。(对于好奇的人:
person->person.lastName
需要使用)
另外,请记住,这个答案不同于有人声称,如果一个对象需要遵循某个接口,那么必须使用getter和setter。在本例中,
Person
类不遵循任何接口,但却从可用的getter中获益。+1我一直喜欢较短的getter/settervoid lastName(String lastName)
和String lastName()
@PeterLawrey如果您将IDE设置为在键入时弹出建议,我会觉得它们很烦人,与getXXX
版本一样,当您键入g
时,您将立即获得所有getter的列表。我根据可以在IDE中看到的字段名添加()。无论如何,这只是风格的问题,我同意你的回答。这并没有解决最初的问题。这只是Java中setter和getter的标准示例。
public class Customer {
private String email;
public void setEmail(String email) { this.email = email; }
public String getEmail() { return email; }
}