Java教程:一文详解函数式编程

看懂了这篇-你就懂了函数式接口

​ 函数式编程是一种编程规范或一种编程思想,简单可以理解问将运算或实现过程看做是函数的计算。 Java8为了实现函数式编程,提出了3个重要的概念:Lambda表达式、方法引用、函数式接口。现在很多公司都在使用lambda表达式进行代码编写,甚至知名的Java的插件也都在Lambda,比如数据库插件MybatisPlus。Lambda表达式的使用是需要函数式接口的支持,即lambda表达式的核心就是使用大量的函数式接口。本文带领大家全面了解函数式接口的定义和使用。

一、文章导读

  • 函数式接口概述
  • 自定义函数式接口
  • 常用函数式接口
  • 函数式接口的练习

二、函数式接口概述

1.函数式接口定义

如果接口里只有一个抽象方法,那么就是函数式接口,可以使用注解(@FunctionalInterface)检测该接口是否是函数式接口,即只能有一个抽象方法。

注意事项

函数式接口里可以定义默认方法:默认方法有方法体,不是抽象方法,符合函数式接口的定义要求。
函数式接口里可以定义静态方法:静态方法也不是抽象方法,是一个有具体方法实现的方法,同样也符合函数式接口的定义的。
函数式接口里可以定义Object里的public方法(改成抽象方法):虽然它们是抽象方法,却不需要覆盖重写,因为所有接口的实现类都是Object类的子类,而在Object类中有这些方法的具体的实现。

2.函数式接口格式

修饰符 interface 接口名称 {
   
    //抽象方法
    public abstract 返回值类型 方法名称(可选参数信息);
    //默认方法
    public default 返回值类型 方法名称(可选参数信息) {
   
        //代码...        
    }
    //静态方法
    public static 返回值类型 方法名称(可选参数信息) {
   
        //代码...        
    }
    //Object类的public方法变成抽象方法
    public abstract boolean equals(Object obj);
    public abstract String toString();    
}

三、自定义函数式接口

1.自定义函数式接口举例

由于接口当中抽象方法的public abstract是可以省略的,所以定义一个函数式接口很简单:

@FunctionalInterface
public interface MyFunctionalInterface {
   
    //抽象方法
    public abstract void method();
    //Object类的public方法变成抽象方法
    public abstract boolean equals(Object obj);
    public abstract String toString();
    //默认方法
    public default void show(String s) {
   
        //打印小写
        System.out.println(s.toLowerCase());
    }
    //静态方法
    public static void print(String s) {
   
        //打印大写
        System.out.println(s.toUpperCase());
    }
}

2.自定义函数式接口的应用

对于刚刚定义好的MyFunctionalInterface函数式接口,典型使用场景就是作为方法的参数:

public class Demo01FunctionalInterface {
   
    public static void main(String[] args) {
   
        // 调用使用函数式接口的方法
        show(()->{
   
            System.out.println("Lambda执行了");
        });
    }
    //定义方法使用函数式接口作为参数
    public static void show(MyFunctionalInterface mfi) {
   
        //调用自己定义的函数式接口
        mfi.method();
        String s = mfi.toString();
        System.out.println(s);
        boolean result = mfi.equals(mfi);
        System.out.println(result);
        mfi.show("world");
        MyFunctionalInterface.print("function");
    }
}

3.运行结果:

Lambda执行了
Demo01FunctionalInterface$$Lambda$1/1078694789@3d075dc0
true
world
FUNCTION

四、常用函数式接口

前面我们自己定义了一个函数式接口,对于一些常用的函数式接口,每次自己定义非常麻烦。JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在`java.util.function`包中被提供。这样的接口有很多,下面是最简单的几个接口及使用示例。

1. Supplier接口

java.util.function.Supplier<T>接口,它意味着"供给" , 对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。

1.1.抽象方法 : get
Supplier`接口中包含一个抽象方法` T get(): 用来获取一个泛型参数指定类型的对象数据。	
public class Demo02Supplier {
   
    public static void main(String[] args) {
   
        int num = getNum(() -> {
   
            return new Random().nextInt();
        });
        System.out.println(num);
    }
    public static int getNum(Supplier<Integer> supplier) {
   
        int num = supplier.get();
        return num;
    }
}
1.2.求集合元素最大值

使用Supplier接口作为方法参数类型,通过Lambda表达式求出List集合(存储int数据)中的最大值。提示:接口的泛型请使用java.lang.Integer类。

代码示例:

public class Demo03Supplier {
   
    public static void main(String[] args) {
   
        List<Integer> list = new ArrayList
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值