博主
258
258
258
258
专辑

第十二节 Java8的函数式接口

亮子 2021-09-14 21:19:46 3637 0 0 0

13、函数式接口

函数式接口在java中是指:有且仅有一个抽象方法的接口

函数式接口,即适用于函数式编程场景的接口。而java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。

备注:“语法糖"是指使用更加方便,但是原理不变的代码语法。例如在遍历集合时使用的for-each语法,其实底层的实现原理仍然是迭代器,这便是“语法糖”。从应用层面来讲,Java中的Lambda可以被当做是匿名内部类的“语法糖”,但是二者在原理上是不同的。

1)、示例代码1:

@FunctionalInterface
interface MessageBuilder {
    String buildMessage();
}

public class LambdaTest2 {

    private static void log(int level, MessageBuilder builder) {
        if (level == 1) {
            // 实际上利用内部类 延迟的原理,代码不相关 无需进入到启动代理执行
            System.out.println(builder.buildMessage());
        }
    }

    public static void main(String[] args) {
        String msgA = "Hello";
        String msgB = "World";
        String msgC = "Java";
        log(1,()->{
            System.out.println("lambda 是否执行了");
            return msgA + msgB + msgC;
        });
    }
}

2)、示例代码2:

package com.shenmazong.lambda;

import java.util.function.Supplier;

/**
 * @program: server-java-demo
 * @description: 求数组元素最大值
 * @author: 亮子说编程
 * @create: 2020-10-19 16:11
 **/
public class use_Supplier_Max_Value {
    private static int getMax(Supplier<Integer> suply) {
        return suply.get();
    }
    public static void main(String[] args) {
        Integer [] data = new Integer[] {6,5,4,3,2,1};
        int reslut = getMax(()->{
            int max=0;
            for (int i = 0; i < data.length; i++) {
                max = Math.max(max, data[i]);
            }
            return max;
        });
        System.out.println(reslut);
    }
}