Java:Lambda简化匿名内部类

Java内部类详解
Java:Lambda简化匿名内部类

Lambda概述、基本用法

  1. Lambda表达式是JDK 8开始后的一种新语法形式。
  2. 作用:简化函数式接口的匿名内部类的写法。

Lambda表达式的简化格式

(匿名内部类被重写方法的形参列表) -> {
	被重写方法的方法体代码。
}
注:-> 是语法形式,无实际含义

注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式

什么是函数式接口?

  • 必须是接口的匿名内部类,接口中只能有一个抽象方法

代码示例

public class LambdaDemo {
    public static void main(String[] args) {
        // 目标:学会使用Lambda的标准格式简化匿名内部类的代码形式
        // 注意:Lambda只能简化接口中只有一个抽象方法的匿名内部类形式(函数式接口)
//        Swimming s1 = new Swimming() {
//            @Override
//            public void swim() {
//                System.out.println("老师游泳贼溜~~~~~");
//            }
//        };

//        Swimming s1 = () -> {
//            System.out.println("老师游泳贼溜~~~~~");
//        };

        Swimming s1 = () -> System.out.println("老师游泳贼溜~~~~~");
        go(s1);

        System.out.println("---------------------");
//        go(new Swimming() {
//            @Override
//            public void swim() {
//                System.out.println("学生游泳很开心~~~");
//            }
//        });

//        go(() ->{
//                System.out.println("学生游泳很开心~~~");
//        });

        go(() -> System.out.println("学生游泳很开心~~~"));


    }

    public static void go(Swimming s){
        System.out.println("开始。。。");
        s.swim();
        System.out.println("结束。。。");
    }
}

@FunctionalInterface // 一旦加上这个注解必须是函数式接口,里面只能有一个抽象方法
interface Swimming{
    void swim();
}

简化常见函数式接口

简化Comparator接口的匿名形式

Java Arrays类自定义排序
在这里插入图片描述

简化按钮监听器ActionListener的匿名内部类形式

在这里插入图片描述

代码示例

public class LambdaDemo3 {
    public static void main(String[] args) {
        Integer[] ages1 = {34, 12, 42, 23};
        /**
         参数一:被排序的数组 必须是引用类型的元素
         参数二:匿名内部类对象,代表了一个比较器对象。
         */
//        Arrays.sort(ages1, new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o2 - o1; //  降序
//            }
//        });

//        Arrays.sort(ages1, (Integer o1, Integer o2) -> {
//                return o2 - o1; //  降序
//        });


//        Arrays.sort(ages1, ( o1,  o2) -> {
//            return o2 - o1; //  降序
//        });

        Arrays.sort(ages1, ( o1,  o2 ) ->  o2 - o1 );

        System.out.println(Arrays.toString(ages1));

        System.out.println("---------------------------");
        JFrame win = new JFrame("登录界面");
        JButton btn = new JButton("我是一个很大的按钮");
//        btn.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent 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("有人点我,点我,点我!!") );



        win.add(btn);
        win.setSize(400, 300);
        win.setVisible(true);
    }
}

Lambda表达式的省略规则

  1. 参数类型可以省略不写;
  2. 如果只有一个参数,参数类型可以省略,同时()也可以省略;
  3. 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号;
  4. 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写;

上面的两个代码示例,均已简化到最简形式。


版权声明:本文为weixin_52341477原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。