函数式编程

此“函数”类似数学中的函数,只要输入的数据一致,返回的结果也一致。

函数式编程解决了什么问题?
使用Lambda函数替代某些匿名内部类对象,让程序代码更整洁,可读性更好

Lambda表达式

在这里插入图片描述
注意
Lambda表达式只能替代函数式接口的匿名内部类

什么是函数式接口
有且仅有一个抽象方法的接口

public class test {
    //认识lambda表达式
    public static void main(String[] args) {
        animal a = new animal() {
            @Override
            public void shout() {
                System.out.println("喵喵喵");
            }
        };
        a.shout();
        //错误的示范:lambda不能简化全部的匿名内部类,lambda只能简化函数式接口的匿名内部类
        /*animal a1 = () -> {
            System.out.println("喵喵喵");
        };
        a1.shout();*/

        swim s = () -> {
            System.out.println("开始游泳");
        };
        s.swimming();
    }
}

abstract class animal{
    public abstract void shout();
}

//函数式接口:函数接口,只有一个抽象方法
@FunctionalInterface //声明函数式接口的注解
interface swim{
    void swimming();
}

Lambda表达式简化comparator接口的匿名内部类

Lambda表达式的省略规则

  1. 参数类型全部可以省略不写
  2. 若只有一个参数,参数类型省略的同时“()”也可以省略,但多个参数不能省略“()”
  3. 若Lambda表达式中只有一行代码,大括号可以不写,同时要省略分号“;”,若这行代码是return语句,也要去掉return
public class test {
    public static void main(String[] args) {
        test1();
        test2();
    }

    public static void test1(){
        Student[] students = new Student[6];
        students[0] = new Student("小王", 18, 180.5, '男');
        students[1] = new Student("小张", 25, 180.5, '男');
        students[2] = new Student("小李", 17, 170.5, '男');
        students[3] = new Student("小赵", 20, 165.5, '女');
        students[4] = new Student("小王", 19, 182.5, '男');
        students[5] = new Student("小周", 35, 170.5, '女');

        //需求:按年龄升序排序,可以调用sun公司写好的API直接对数组进行排序
        /*Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() - o2.getAge();//按照年龄升序
            }
        });*/

        /*Arrays.sort(students, (Student o1, Student o2) -> {
            return o1.getAge() - o2.getAge();//按照年龄升序
        });*/
        /*Arrays.sort(students, (o1, o2) -> {
            return o1.getAge() - o2.getAge();//按照年龄升序
        });*/

        Arrays.sort(students, (o1, o2) -> o1.getAge() - o2.getAge());

        for (int i = 0; i < students.length; i++) {
            Student s = students[i];
            System.out.println(s);
        }
    }

    public static void test2(){
        //匿名内部类的使用场景
        //需求:创建一个登陆窗口,窗口上只有一个登录按钮
        JFrame jf = new JFrame("登陆窗口");
        jf.setSize(400, 300);
        jf.setLocationRelativeTo(null);//居中
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序

        JPanel panel = new JPanel();
        jf.add(panel);

        JButton btn = new JButton("登录");
        panel.add(btn);

        //java要求必须给这个按钮添加一个点击事件监听器对象,这就可以监听用户的点击操作
        //开发中不是我们要写匿名内部类,而是用别人的功能的时候,别人允许让我们写一个匿名内部类,我们才会写。
        /*btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("点击了登录按钮");
            }
        });*/
        //btn.addActionListener(e -> System.out.println("点击了登录按钮"));

        /*btn.addActionListener((ActionEvent e) -> {
            System.out.println("点击了登录按钮");
        });*/

        /*btn.addActionListener((e) -> {
            System.out.println("点击了登录按钮");
        });*/

        /*btn.addActionListener(e -> {
            System.out.println("点击了登录按钮");
        });*/

        btn.addActionListener(e -> System.out.println("点击了登录按钮"));

        jf.setVisible(true);
    }
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐