Java8-Lambda

lambda 前置条件

必须是函数式接口才可以使用lambda表达式


什么是函数式接口

  • 接口中标注了@Functionallnterface 注解
  • 接口中只有一个抽像方法会被编译器自动认识成函数式接口
  • 接口中有一个抽像方法,同时包含了Object类的其它抽像方法也会被识别成抽像接口
package lambda;

/**
 * @author pangjian
 * @Interface LambdaTest
 * @Description 
 *      1.加了@FunctionalInterface注解
 *      2.接口中只有一个唯一的一个抽象方法sayHello(),被编译器自动推导成函数式接口
 *      3.如果多余的抽象方法是Object方法,那也是函数式接口
 * @date 2021/8/25 11:22
 */
@FunctionalInterface
public interface LambdaTest {

    void sayHello();
    
    String toString();
    
    default void sayHello2(){
        
    }
    
}

1.Expression单条语句表达式

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
package lambda;

/**
 * @author pangjian
 * @ClassName Expression
 * @Description expression:单条语句表达式,如果接口方法要返回值,不需要写return关键字,
 *                          解释器自动将表达式的计算结果返回,
 *                          单条语句表达式只能是一个语句。
 * @date 2021/8/25 19:44
 */

public class Expression {

    /**
     * @Description:函数式接口
    */
    public interface Lambda{
        Integer add(Integer a, Integer b);
    }

    public static void main(String[] args) {
        // 直接实现接口方法逻辑,调用传参即可,a和b的类型不指定根据接口参数类型自动推导,(参数列表) -> 表达式
        Lambda lambda = (a, b) -> a + b;
        lambda.add(22, 44);
    }
    
}

2.statement语句块

package lambda;

/**
 * @author pangjian
 * @ClassName Statement
 * @Description 多个语句可以通过语句块去编写lambda表达式,用{}包裹多条语句,
 *              如果需要返回结果,必须显示的加上return指明返回的变量
 * @date 2021/8/25 19:55
 */

public class Statement {

    /**
     * @Description:函数式接口
     */
    public interface Lambda{
        Integer add(Integer a, Integer b);
    }

    public static void main(String[] args) {
        Lambda lambda = (a, b) -> {
            System.out.println(a);
            System.out.println(b);
            return a + b;
        };
        Integer i = lambda.add(44, 55);
    }

}

3.reference方法引用

如果某个方法在结构上与lambada表达式中对应方法是匹配的那么就可以直接引用给lambada表达示(把lambda体变成更简洁的方法引用)。其总共包含4种引用类型语法格式见表格:

类型语法
基于实例方法引用实例对象::方法名
构造方法引用类名::new
基于参数实例实例方法引用类名::方法名
静态方法引用类名::静态方法名
package lambda;

import java.util.function.Supplier;

/**
 * @author pangjian
 * @ClassName Reference
 * @Description 方法引用:就是说我们的Lambda体已经有了相关实现,我们就可以使用方法引用的方式直接调用
 * @date 2021/8/25 20:09
 */

public class Reference {

    /**
     * @Description:函数式接口
     */
    public interface Lambda{
        void add(String a);
    }

    public interface Lambda1{
        Boolean Compare(String a, String b);
    }


    public void test(String a){
        System.out.println(a);
    }


    public static void main(String[] args) {
        /**
         * @Description:对象::实例方法名(new Reference()::test)
        */
        Lambda lambda = (a) -> System.out.println(a);
        Lambda lambda1 = new Reference()::test;
        lambda.add("hello");
        lambda1.add("world");

        /**
         * @Description:类::静态方法名(Integer::parseInt)
        */
        Lambda lambda2 = (a) -> Integer.parseInt(a);
        Lambda lambda3 = Integer::parseInt;

        /**
         * @Description:类::实例方法名(String::equals,a是调用者,b是调用方法参数)
         * 特殊,当Lambda体的第一个参数是该实例方法的调用者,另一个参数是实例方法的参数时,我们可以用该语法
        */
        Lambda1 lambda11 = (a, b) -> a.equals(b);
        Lambda1 lambda12 = String::equals;
        System.out.println(lambda12.Compare("相等", "相等"));

        /**
         * @Description:类::new (String::new)
         * 就是说我们的Lambda休已经有相关的方法实现了的话,我们就可以使用构造器引用的方式直接调用
        */
        Supplier<String> supplier = () -> new String();
        Supplier<String> supplier1 = String::new;

    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值