使用Lambda表达式简化上述“Staff与Comparator接口”题目中的NameComparator,AgeComparator和ComplexComparator比较器。测试方法与上述相同。
时间: 2023-10-25 10:16:07 浏览: 123
好的,使用Lambda表达式可以大大简化比较器的编写。下面是三个使用Lambda表达式实现的比较器示例:
```java
Comparator<Staff> nameComparator = (s1, s2) -> s1.getName().compareTo(s2.getName());
Comparator<Staff> ageComparator = (s1, s2) -> s1.getAge() - s2.getAge();
Comparator<Staff> complexComparator = (s1, s2) -> {
int result = s1.getName().compareTo(s2.getName());
if (result == 0) {
result = s2.getAge() - s1.getAge();
}
return result;
};
```
可以看到,Lambda表达式的使用使得比较器的编写更加简洁明了。其中,`(s1, s2) -> s1.getName().compareTo(s2.getName())` 表示比较两个Staff对象的姓名;`(s1, s2) -> s1.getAge() - s2.getAge()` 表示比较两个Staff对象的年龄;`(s1, s2) -> {...}` 表示比较两个Staff对象的姓名和年龄,如果姓名相同,则按年龄降序排列。
相关问题
用java实现以下代码: 定义Staff类(职工),添加如下属性(name, address, age, sex, salary, dateHired),类型自定,其中salary为工资,dateHired为雇佣日期(java.util.Date类型)。生成相应的setter/getter方法。编写NameComparator,AgeComparator和ComplexComparator比较器。其中ComplexComparator为复合比较器,选用工资和雇佣日期进行升序排序。比较器中需要使用Lambda表达式来完成
以下是用Java实现的代码:
```
import java.util.*;
public class Staff {
private String name;
private String address;
private int age;
private String sex;
private double salary;
private Date dateHired;
public Staff(String name, String address, int age, String sex, double salary, Date dateHired) {
this.name = name;
this.address = address;
this.age = age;
this.sex = sex;
this.salary = salary;
this.dateHired = dateHired;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Date getDateHired() {
return dateHired;
}
public void setDateHired(Date dateHired) {
this.dateHired = dateHired;
}
}
class NameComparator implements Comparator<Staff> {
public int compare(Staff a, Staff b) {
return a.getName().compareTo(b.getName());
}
}
class AgeComparator implements Comparator<Staff> {
public int compare(Staff a, Staff b) {
return a.getAge() - b.getAge();
}
}
class ComplexComparator implements Comparator<Staff> {
public int compare(Staff a, Staff b) {
if (a.getSalary() != b.getSalary()) {
return Double.compare(a.getSalary(), b.getSalary());
} else {
return a.getDateHired().compareTo(b.getDateHired());
}
}
}
class Main {
public static void main(String[] args) {
List<Staff> staffList = new ArrayList<>();
staffList.add(new Staff("Alice", "123 Main St", 25, "F", 50000, new Date(2021, 1, 1)));
staffList.add(new Staff("Bob", "456 Second St", 30, "M", 60000, new Date(2020, 1, 1)));
staffList.add(new Staff("Charlie", "789 Third St", 35, "M", 70000, new Date(2019, 1, 1)));
// Sort by name using NameComparator
Collections.sort(staffList, new NameComparator());
System.out.println("Sorted by name:");
for (Staff staff : staffList) {
System.out.println(staff.getName());
}
// Sort by age using AgeComparator
Collections.sort(staffList, new AgeComparator());
System.out.println("Sorted by age:");
for (Staff staff : staffList) {
System.out.println(staff.getAge());
}
// Sort by salary and date hired using ComplexComparator
Collections.sort(staffList, new ComplexComparator());
System.out.println("Sorted by salary and date hired:");
for (Staff staff : staffList) {
System.out.println(staff.getSalary() + ", " + staff.getDateHired());
}
}
}
```
如何在Java中使用Lambda表达式简化代码?
在Java中,Lambda表达式提供了一种简洁的方式来表示只包含一个方法的接口(也称为函数式接口)的实例。Lambda表达式可以极大地简化代码,特别是当你使用匿名内部类时。Lambda表达式的基本语法是:
```
(parameters) -> expression
或
(parameters) -> { statements; }
```
下面是一个使用Lambda表达式简化代码的例子:
假设我们有一个`Comparator`接口的匿名内部类实例,用于比较两个字符串的长度:
```java
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
};
```
使用Lambda表达式,可以将上述匿名内部类替换为以下形式的代码:
```java
Comparator<String> comparator = (s1, s2) -> Integer.compare(s1.length(), s2.length());
```
这个Lambda表达式替代了原有的`compare`方法的实现,使得代码更加简洁明了。
Lambda表达式还允许你直接使用方法引用和构造函数引用,进一步简化代码。例如,如果你想对一个列表进行排序,使用Lambda表达式可以写为:
```java
List<String> list = Arrays.asList("Apple", "Orange", "Banana", "Pear");
list.sort((s1, s2) -> s1.compareTo(s2));
```
或者,使用方法引用来进一步简化:
```java
list.sort(String::compareTo);
```
在Java 8及以后的版本中,Lambda表达式配合Stream API可以实现更加流畅和高效的数据处理:
```java
List<String> fruits = list.stream()
.filter(f -> f.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
```
这里使用了`filter`和`map`方法的Lambda表达式,对列表进行过滤和转换,然后收集结果。
使用Lambda表达式的好处是代码更加简洁,并且能够提高代码的可读性和可维护性。但是,需要注意的是Lambda表达式只适用于函数式接口,这些接口只能有一个抽象方法。