Java 8 - 带有嵌套对象的比较器
Java 8 - Comparator with nested objects
我正在编写比较器来比较两个员工对象。
这里我尝试根据部门比较两个员工对象,然后分别是他们的姓名和 ID。
我在这里面临的问题是与原语的比较,它们的包装器很简单,但是当我试图根据他们的部门比较两个员工时,我遇到了以下编译错误:
The type Employee does not define getDept(T) that is applicable here
根据我的理解,甚至 部门 getDept() 也应该扩展为
getDept(这个)
同时作为函数调用并提供部门详细信息。
代码如下:
Employee.java
package com.deloitte.javatut.pojo;
public class Employee {
public Employee() {
// TODO Auto-generated constructor stub
}
private String emptName;
private Long empId;
private Department dept;
public String getEmptName() {
return emptName;
}
public void setEmptName(String emptName) {
this.emptName = emptName;
}
public Long getEmpId() {
return empId;
}
public void setEmpId(Long empId) {
this.empId = empId;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
}
Department.java
package com.deloitte.javatut.pojo;
public class部门{
public Department() {
// TODO Auto-generated constructor stub
}
private String deptName;
private Long deptId;
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((deptId == null) ? 0 : deptId.hashCode());
result = prime * result + ((deptName == null) ? 0 : deptName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Department other = (Department) obj;
if (deptId == null) {
if (other.deptId != null)
return false;
} else if (!deptId.equals(other.deptId))
return false;
if (deptName == null) {
if (other.deptName != null)
return false;
} else if (!deptName.equals(other.deptName))
return false;
return true;
}
}
比较逻辑:
public static void main(String[] args) {
// TODO Auto-generated method stub
Department dept = new Department();
dept.setDeptId(1L);
dept.setDeptName("IT");
Employee emp = new Employee();
emp.setEmpId(2L);
emp.setEmptName("John Doe");
emp.setDept(dept);
Employee emp2 = new Employee();
emp2.setEmpId(4L);
emp2.setEmptName("John Doe 2");
emp2.setDept(dept);
Function<Employee, Department> deptFunction = Employee::getDept;
Comparator<Employee> empComparator = Comparator.comparing(Employee::getDept)
.thenComparing(Employee::getEmpId).thenComparing(Employee::getEmptName);
}
Department
没有实现Comparable<Department>
,所以Java不认为是可比的。
要完成这项工作,您可以让 Department
实施 Comparable<Department>
:
class Department implements Comparable<Department> {
// ...
public int compareTo(Department other) {
// By "compare by department", you probably meant comparing by the department name, right?
// If not, implement your own compareTo
return getName().compareTo(other.getName());
}
}
或者,比较 comparing
中实际具有可比性的内容:
Comparator<Employee> empComparator = Comparator.comparing(x -> x.getDept().getName())
.thenComparing(Employee::getEmpId).thenComparing(Employee::getEmptName);
我正在编写比较器来比较两个员工对象。
这里我尝试根据部门比较两个员工对象,然后分别是他们的姓名和 ID。
我在这里面临的问题是与原语的比较,它们的包装器很简单,但是当我试图根据他们的部门比较两个员工时,我遇到了以下编译错误:
The type Employee does not define getDept(T) that is applicable here
根据我的理解,甚至 部门 getDept() 也应该扩展为
getDept(这个)
同时作为函数调用并提供部门详细信息。
代码如下:
Employee.java
package com.deloitte.javatut.pojo;
public class Employee {
public Employee() {
// TODO Auto-generated constructor stub
}
private String emptName;
private Long empId;
private Department dept;
public String getEmptName() {
return emptName;
}
public void setEmptName(String emptName) {
this.emptName = emptName;
}
public Long getEmpId() {
return empId;
}
public void setEmpId(Long empId) {
this.empId = empId;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
}
Department.java
package com.deloitte.javatut.pojo;
public class部门{
public Department() {
// TODO Auto-generated constructor stub
}
private String deptName;
private Long deptId;
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((deptId == null) ? 0 : deptId.hashCode());
result = prime * result + ((deptName == null) ? 0 : deptName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Department other = (Department) obj;
if (deptId == null) {
if (other.deptId != null)
return false;
} else if (!deptId.equals(other.deptId))
return false;
if (deptName == null) {
if (other.deptName != null)
return false;
} else if (!deptName.equals(other.deptName))
return false;
return true;
}
}
比较逻辑:
public static void main(String[] args) {
// TODO Auto-generated method stub
Department dept = new Department();
dept.setDeptId(1L);
dept.setDeptName("IT");
Employee emp = new Employee();
emp.setEmpId(2L);
emp.setEmptName("John Doe");
emp.setDept(dept);
Employee emp2 = new Employee();
emp2.setEmpId(4L);
emp2.setEmptName("John Doe 2");
emp2.setDept(dept);
Function<Employee, Department> deptFunction = Employee::getDept;
Comparator<Employee> empComparator = Comparator.comparing(Employee::getDept)
.thenComparing(Employee::getEmpId).thenComparing(Employee::getEmptName);
}
Department
没有实现Comparable<Department>
,所以Java不认为是可比的。
要完成这项工作,您可以让 Department
实施 Comparable<Department>
:
class Department implements Comparable<Department> {
// ...
public int compareTo(Department other) {
// By "compare by department", you probably meant comparing by the department name, right?
// If not, implement your own compareTo
return getName().compareTo(other.getName());
}
}
或者,比较 comparing
中实际具有可比性的内容:
Comparator<Employee> empComparator = Comparator.comparing(x -> x.getDept().getName())
.thenComparing(Employee::getEmpId).thenComparing(Employee::getEmptName);