【Java面向对象】用Lambda表达式比较器Comparator给List对象排序实验

背景介绍

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方法,可以成功解决这一问题。

猜你喜欢

转载自blog.csdn.net/ayaishere_/article/details/128711861
今日推荐