背景介绍
Lambda表达式是JAVA8中提供的一种新的特性,是一个匿名函数方法。可以把Lambda表达式理解为一段可以传递的代码,可以写出更简洁、更灵活的代码。
Lambda表达式就是对函数式接口中抽象方法的实现,是对其匿名内部类的一个简写,只保留了方法的参数列表和方法体,其他的成分可以省略。因此,Lambda表达式的格式非常简洁,只有三部分组成:
参数列表
箭头
方法体
即 (参数列表)->{方法体}
实验内容
使用Lambda表达式比较器Comparator给List对象排序,分别按Name、Age(倒序)、Grade排序。List对象内容如下表:
ID | Name | Age | Grade |
1 | ZhangSan | 28 | 98 |
2 | LiSi | 21 | 100 |
3 | KangKang | 27 | 89 |
4 | LiMing | 19 | 92 |
5 | WangGang | 22 | 66 |
6 | ZhaoXin | 24 | 85 |
7 | LiuWei | 20 | 78 |
8 | BaiZhanTang | 16 | 99 |
(1)实验思路
①定义类Info,将需要比较的各项内容看作Info类中的成员变量,通过比较成员变量的值进行排序。设置四个成员变量:int类型的ID,String类型的name,int类型的age和int类型的grade,并将之设置为private。
②设置各个成员变量的get方法,并重载toString方法以输出个人信息。
③定义类Test,并在main方法中定义元素类型为Info类的List。通过创建Info实例,将8个人的信息输入List中。
④使用Comparator接口中处理排序问题的sort方法进行List内的元素排序,简化比较且满足题意。sort中的函数使用lambda表达式,对于String类型的name,使用compareTo方法进行比较;对于Integer类型的age和grade,使用Integer类的compare方法进行比较。
⑤使用foreach语句,对List中的元素进行输出。
(2)实验源码
Info类:
public class Info{
private int ID;
private String name;
private int age;
private int grade;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getGrade() {
return grade;
}
Info(int ID,String name,int age,int grade){
this.ID=ID;
this.name=name;
this.age=age;
this.grade=grade;
}
public String toString() {
return "ID:"+ID+" "+"Name:"+name+" "+"Age:"+age+" "+"Grade:"+grade+" ";
}
}
Test类:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Info> myList = new ArrayList<>();
myList.add(new Info(1, "ZhangSan", 28, 98));
myList.add(new Info(2, "LiSi", 21, 100));
myList.add(new Info(3, "KangKang", 27, 89));
myList.add(new Info(4, "LiMing", 19, 92));
myList.add(new Info(5, "WangGang", 22, 66));
myList.add(new Info(6, "ZhaoXin", 24, 85));
myList.add(new Info(7, "LiuWei", 20, 78));
myList.add(new Info(8, "BaiZhanTang", 16, 99));
myList.sort((Info i1, Info i2) -> (i1.getName()).compareTo(i2.getName()));
System.out.println("按Name排序:");
for (Info elem : myList) {
System.out.println(elem.toString());
}
myList.sort((Info i1, Info i2) -> (Integer.compare(i1.getAge(), i2.getAge())));
Collections.reverse(myList);
System.out.println("\n按Age倒序排序:");
for (Info elem : myList) {
System.out.println(elem.toString());
}
myList.sort((Info i1, Info i2) -> (Integer.compare(i1.getGrade(), i2.getGrade())));
System.out.println("\n按Grade排序:");
for (Info elem : myList) {
System.out.println(elem.toString());
}
}
}
(3)运行截图
(4)实验心得
此题中共有三个难点。
第一个难点在于List的学习与使用。在此之前,我们很少接触List,如何使用List成为了一个很大的困难。
第二个难点在于lambda表达式的使用,如何使用lambda表达式编写简单易懂的函数表达式成为了一个困难。通过简单的“->”,我实现了匿名函数的书写,更加方便地实现了排序函数。
第三个难点在于使用Comparator接口下的sort函数排序时的函数编写。其一在于,sort函数的使用需要一定基础;其二在于比较函数的编写。String类型的比较可以通过compareTo直接返回int值;由于int类型无法使用comapreTo语句,三元运算符比较又显冗长繁琐,如何对int(Integer)类型的成员进行比较成为了一个困难。通过使用Integer类型自带的compare方法,可以成功解决这一问题。