Jdk8之Lambda表达式

1. Lambda表达式

1.1 定义

lambda表达式是一个匿名函数,作为一种紧凑的代码风格,使它设计的代码会更简洁。

1.2 基本语法
(parameter...)->expression;
(parameter...)->{expression;}
1.3 实现依据

函数式接口保证了lambda表达式调用的接口只有一个需要实现的抽象方法,因此lambda参数可确定实现的抽象方法的返回值、方法名、参数类型,因此表达式中,上述内容均不需要书写,保证了代码的紧凑(参数类型可加可不加)。

jdk8版本,一些接口,如Runnable接口,默认添加的相应注解,可以直接使用此表达式。

1.4 代码

(1)原始实现方式

//原始方式
new Thread(new Runnable() {
    @Override
    public void run() {
        //业务方法
        System.out.println("thread method...");
    }
}).start();

(2)lambda实现方式

new Thread(() -> {
    //业务方法
    System.out.println("thread method...");
}).start();

2. 函数式接口

2.1 定义
  • 关键字:接口注解@FunctionalInterface
  • 用途:可以用lambda表达式声明该类接口的实现
  • 定义:有且只有一个抽象方法,但是可以有很多个非抽象方法的接口
    • 有且只有一个抽象方法
    • 可以有default方法
    • 可以声明抽象方法覆盖java.lang.Object中的public方法
2.2 代码
2.2.1 不带返回值的抽象方法

(1)定义接口

@FunctionalInterface
public interface FunctionInterface{

    /**
     * 1、有且只有一个抽象方法
     */
    void abstractMethod();

    /**
     * 2、可以有default方法
     */
    default void defaultMethd(){
        System.out.println("default method");
    }

    /**
     * 3、可以声明抽象方法覆盖java.lang.Object中public方法
     */
    String toString();
}

(2)lambda表达式调用接口

//(1)声明参数类型
FunctionalInterfaceTest function1=(String param)-> System.out.println("测试抽象方法1,参数:"+String.valueOf(param));

//(2)不声明参数类型
FunctionalInterfaceTest function2=(param)->System.out.println("测试抽象方法2,参数:"+String.valueOf(param));

//(3)带大括号(如抽象方法有返回值,必须采用此带“大括号”的方式)
FunctionalInterfaceTest function3=(param)->{System.out.println("测试抽象方法3,参数:"+String.valueOf(param));};
2.2.2 带返回值的抽象方法

(1)定义接口

@FunctionalInterface
public interface FunctionalInterfaceTest{

/**
* 1、有且只有一个抽象方法
*/
String abstractMethod(String param);

/**
* 2、可以有default方法
*/
default void defaultMethod(){
    System.out.println("default method");
}

/**
* 3、可以声明抽象方法覆盖java.lang.Object中public方法
*/
String toString();
}

(2)lambda表达式调用接口

//(1)直接返回值
FunctionalInterfaceTest function1=(String param)->param;

//(2)返回运算结果
FunctionalInterfaceTest function2=(param)->"接收参数:"+String.valueOf(param);

//(3)带大括号
FunctionalInterfaceTest function3=(param)->{
    String result="接收参数"+param;
    return result;
};

3. 方法引用

3.1 含义

是一种语法糖,可以至今引用已有Java类或对象的方法或构造器,与lambda表达式结合使用,可以进一步简化代码

lambda表达式的部分场景可以使用方法引用进行替换,并不是所有的lambda表达式都可以使用方法引用。使用方法引用的地方都可以使用lambda替换。

3.2 适用场景

(1)lambda表达式的主题仅包含一个表达式,且表达式仅调用了一个已存在的方法。

(2)方法引用所使用方法的入参返回值与lambda表达式实现的函数式接口的入参返回值一致。

3.3 四种形式
类型使用形式
静态方法引用ClassName :: staticMethodName
构造器引用ClassName :: new
类的任意对象的实例方法引用ClassName :: instanceMethodName
特定对象的实例方法引用object :: instanceMethodName
3.4 代码
3.4.1 静态方法引用

(1)语法格式:类名::静态方法名

(2)适用场景:适用于lambda表达式主体中只调用了某个类的静态方法

public class MethodReference1 {
    
    public static void main(String[] args) {
        //lambda表达式
        Arrays.asList("1","2","3").forEach((str)-> MethodReference1.staticMethod(str));
        //静态方法引用
        Arrays.asList("1","2","3").forEach(MethodReference1::staticMethod);
    }
    
    public static void staticMethod(String str){
        System.out.println(str);
    }
}
3.4.2 构造器引用

(1)语法格式:类名:new

(2)适用场景:lambda表达式主体中仅仅调用了某个类的构造函数返回实例的场景

3.4.3 类的任意对象的实例方法引用

未完待续…

3.4.4 特定对象的实例方法引用

未完待续…

3.4 建议

增大了代码的阅读难度,不建议使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值