JDK8(二)lambda 表达式

1、Lambda简介

Lambda表达式是Java 8最流行最常用的功能特性。
它将函数式编程概念引入Java,函数式编程的好处在于可以帮助我们节省大量的代码,非常方便易用,能够大幅度的提高我们的编码效率。

2、须知

2.1、接口—>默认方法

关键字使用default进行修饰, 方法需要方法体。
这样的方法所有的子类会默认实现(不用自己写),如果想要覆盖重写,也可以在实现类中覆盖重写。
default关键字的作用,是用于扩展。

/**
 * 从java8开始,接口当中允许定义default默认方法
 * 修饰符:public default(public可以省略,default不能省略)
 */
public interface MyInterface {
	void method1();
    void method2();
    // 接口中的一个默认方法
    default void methodNew() {
        System.out.println("接口默认方法执行");
    }
}

2.2、接口—>静态方法

default(默认方法),所有的子类会默认实现。
但是,接口的静态方法不会被实现类所继承(实现)。

/**
 * 从java8开始,接口当中允许定义静态方法
 * 修饰符:static xxx
  * 一般类的静态方法用法相同
 */
public interface Animal {
    void eat();
	// 接口中的一个静态方法
    static Animal getAnimal() {
        return new Cat();
    }
}

2.3、函数式接口

函数式接口,在Java中是指:有且仅有一个抽象方法的接口。
函数式接口,即适用于函数式编程场景的接口。
而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。
函数式编程的好处在于可以帮助我们节省大量的代码,非常方便易用,能够大幅度的提高我们的编码效率。
只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。

2.3.1、函数式接口格式与@FunctionalInterface注解

格式:
即接口中,有且只有一个抽象方法的接口,即可。
例如Thread中的 run()方法。

Public interface 接口名称 {
    返回值 方法名称();
}

@FunctionalInterface注解
有的注解是在编译期起作用,如@Override注解。
@FunctionalInterface 注解,同样是在编译期起作用。
该注解是 java8 专门为函数式接口引入的新的注解,作用于一个接口上。
一旦使用该注解来定义接口,编译期会强制检查该接口是否符合函数式接口的条件,不符合则会报错。
注:
即使不使用该注解,只要满足函数式接口的定义,这就是一个函数式接口。

3、lambda表达式

3.1、lambda表达式的格式

格式:
类似于ES6中的箭头函数。

(param1,param2,param3 ...,paramN)-  > { 
 	 //代码块;  
  }

注:

  1. lambda表达式,表达的是函数式接口;
  2. 箭头左侧,是函数的以逗号分隔的形式参数列表;
  3. 箭头右侧是函数体代码;

3.2、lambda表达式的省略原则

1、参数类型可以省略。
但是,只能同时省略所有参数的类型,或者干脆都不省略。
2、如果形参列表中的参数,有且仅有一个,那么小括号可以省略。
3、如果大括号内的语句,有且仅有一条,那么,无论是否有返回值return大括号分号都可以省略

扫描二维码关注公众号,回复: 10434335 查看本文章

3.3、原始写法

package com.zicheng.lambda;

/**
 * 子诚
 * Description:原始写法
 * 时间:2020/3/30 9:38
 */
public class LambdaDemo {
    //抽象功能接口
    interface Printer {
        void print(String val);
    }

    //通过参数传递功能接口
    public void printSomething(String something, Printer printer) {
        printer.print(something);
    }

    //通过创建对象调用函数
    public static void main(String[] args) {
        LambdaDemo demo = new LambdaDemo();
        String something = "I am learning Lambda";
        //实现Printer接口,内部类的方式
        Printer printer = new Printer() {
            @Override
            public void print(String val) {
                //控制台打印
                System.out.println(val);
            }
        };
        //调用接口打印
        demo.printSomething(something, printer);
    }
}

在这里插入图片描述

3.4、lambda表达式写法

package com.zicheng.lambda;

/**
 * 子诚
 * Description:
 * 时间:2020/3/30 10:27
 */
public class LambdaDemo2 {
    //抽象功能接口
    interface Printer {
        void print(String val);
    }

    //通过参数传递功能接口
    public void printSomething(String something, Printer printer) {
        printer.print(something);
    }

    //通过创建对象调用函数
    public static void main(String[] args) {
        LambdaDemo2 demo2 = new LambdaDemo2();
        String something = "I am learning Lambda";
        //实现Printer接口,内部类的方式
        Printer printer = (String val) -> {
            //控制台打印
            System.out.println(val);
        };
        //调用接口打印
        demo2.printSomething(something, printer);
    }
}

在这里插入图片描述

3.5、对3.4中的lambda表达式,进行优化

3.4中的代码

 		//实现Printer接口,内部类的方式
        Printer printer = (String val) -> {
            //控制台打印
            System.out.println(val);
        };

3.5.1、省略参数类型,但又因为只有一个参数,把小括号也省略

		//实现Printer接口,内部类的方式
        Printer printer = val -> {
            //控制台打印
            System.out.println(val);
        };

3.5.2、由于方法体中,只有一条语句,省略大括号

		//实现Printer接口,内部类的方式
        Printer printer = val -> System.out.println(val);
发布了44 篇原创文章 · 获赞 5 · 访问量 887

猜你喜欢

转载自blog.csdn.net/qq_40634246/article/details/105192256