zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【java 8】函数式接口

JAVA接口 函数
2023-09-27 14:26:52 时间

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

前言

我们知道Lambda表达式的前提就是要转换的接口必须是函数式接口,那么这节我们就总结一下函数式接口,看看什么是函数式接口!

什么是函数式接口

  • 只包含一个抽象方法的接口称为函数式接口。
  • 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式
    抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
  • 我们可以在一个接口上使用@Functionallnterface 注解,这样做可以检
    查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
  • 在 java.util.function 包下定义了 Java 8的丰富的函数式接口

如何理解函数式接口

  • Java 从诞生日起就是一直倡导"一切皆对象",在 Java 里面面向对象(OOP)编程是一切。但是随着 python 、 scala 等语言的兴起和新技术的挑战, Java 不得不做出调整以便支持更加广泛的技术要求,也即 java 不但可以支持 OOP 还可以支持 OOF (面向函数式接口)
  • 在函数式编程语言中,函数被当作一等公民对待。在将函数作为一等公民的编程语言中, Lambda 表达式的类型是函数。但是在Java 8中有所不同。在Java8中, Lambda 表达式是对象,而不是函数,它们必须依附于一类特别的对象类型——函数式接口。
  • 简单的说,在Java 8中, Lambda 表达式就是一个函数式接口的实例。这就是 Lambda 表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口的实例,那么该对象就可以用 Lambda 表达式来表示。
  • 所以以前用匿名实现类表示的现在都可以用 Lambda 表达式来写。

java 内置的四大核心函数式接口

请添加图片描述

下面写两个例子对这些函数式接口举例:
举例一:

public static void main(String[] args) {
        // 1.消费型接口
        Consumer<Integer> com = new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println("消费价钱为" + integer);
            }
        };
        com.accept(100);
        // Lambda 表达式写法
        Consumer<Integer> com1 = integer -> System.out.println("消费价钱为" + integer);
        com1.accept(100);
    }

举例二:

    public static void main(String[] args) {
        // 断定型接口 举例:用断定型接口过滤字符串
        List<String> lis1 = Arrays.asList("阿牛", "大牛", "小牛");
        List<String> lis2 = filterString(lis1, new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.contains("牛");
            }
        });
        System.out.println(lis2);

        System.out.println("-------------");
        // Lambda表达式写法
        List<String> lis3 = filterString(lis1, s -> s.contains("牛"));
        System.out.println(lis3);
    }

    public static List<String> filterString(List<String> list, Predicate<String> pre){
        List<String> filterList = new ArrayList<>();
        for (String s : list) {
            if (pre.test(s)) {
                filterList.add(s);
            }
        }
        return filterList;
    }
}

这里举了两个小例子理解函数式接口和Lambda表达式,还有许多函数式接口,这里不再举例,感兴趣的可以自己去了解!

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门