Lambda表达式

Lambda表达式

  • Lambda表达式:特殊的匿名内部类,语法更简洁

  • Lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传 递),将代码像数据一样传递。

  • 基本语法:

    <函数式接口> <变量名> = (参数1,参数2...) -> { //方法体
    };
    
  • Lambda引入了新的操作符:->(箭头操作符),->将表达式分成两部分

    • 左侧:(参数1,参数2…)表示参数列表

    • 右侧:{}内部是方法体

  • 注意事项:

    • 形参列表的数据类型会自动推断。

    • 如果形参列表为空,只需保留() 。

    • 如果形参只有1个,()可以省略,只需要参数的名称即可。

    • 如果执行语句只有一句,且无返回值,{}可以省略,若有返回值,则若想省去{},则 必须同时省略return,且执行语句也保证只有一句。

    • Lambda不会生成一个单独的内部类文件。

函数式接口

  1. 如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口 可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上 。
  2. @FunctionalInterface 注解可以检测接口是否符合函数式接口。

示例:

  1. //接口
    @FunctionalInterface
    public interface Usb {
        void service();
    }
    
  2. //实现
    public class Demo {
        public static void main(String[] args) {
            Usb mouse = new Usb() {
                @Override
                public void service() {
                    System.out.println("鼠标开始工作了...");
                }
            };
    
            Usb fan = () -> System.out.println("风扇开始工作了...");
    
            run(mouse);
            run(fan);
        }
    
        public static void run(Usb usb) {
            usb.service();
        }
    }
    

方法引用

  • 方法引用是Lambda表达式的一种简写形式。 如果Lambda表达式方法体中 只是调用一个特定的已经存在的方法,则可以使用方法引用。

  • 常见形式

    • 对象::实例方法

    • 类::静态方法

    • 类::实例方法

    • 类::new

public class Demo {
	public static void main(String[] args) {
		//1 对象::实例方法
		Consumer<String> consumer=s->System.out.println(s);
		consumer.accept("hello");
		Consumer<String> consumer2=System.out::println;
		consumer.accept("world");
		
		//2类::静态方法
		Comparator<Integer> com=(o1,o2)->Integer.compare(o1, o2);
		Comparator<Integer> com2=Integer::compare;
			
		//3类::实例方法
		Function<Employee, String> function=e->e.getName();
		Function<Employee, String> function2=Employee::getName;
		
		System.out.println(function2.apply(new Employee("小明", 50000)));
		
		//4类::new
		Supplier<Employee> supplier=()->new Employee();
		Supplier<Employee> supplier2=Employee::new;
		
		Employee employee=supplier.get();
		System.out.println(employee.toString());
		
	}
}
posted @ 2020-08-28 18:18  Techoc  阅读(167)  评论(0编辑  收藏  举报