Dha*_*ari 4 comparator java-8 functional-interface
我正在编写一个比较器来比较两个员工对象。
在这里,我试图根据他们的部门来比较两个雇员对象,其后分别是他们的姓名和ID。
我在这里面临的问题是与原始对象的比较,并且它们的包装器很简单,但是当我尝试根据他们的部门比较两个雇员时,出现以下编译错误:
Employee类型未定义适用于此的getDept(T)
根据我的理解,即使部门getDept()也应扩展为
getDept(this)
同时作为功能调用并提供部门详细信息。
代码如下:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
部门.java
package com.deloitte.javatut.pojo;
Run Code Online (Sandbox Code Playgroud)
公共课部{
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;
}
Run Code Online (Sandbox Code Playgroud)
}
比较逻辑:
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);
}
Run Code Online (Sandbox Code Playgroud)
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());
}
}
Run Code Online (Sandbox Code Playgroud)
或者,比较在comparing以下方面实际上可比较的东西:
Comparator<Employee> empComparator = Comparator.comparing(x -> x.getDept().getName())
.thenComparing(Employee::getEmpId).thenComparing(Employee::getEmptName);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
782 次 |
| 最近记录: |