Java8 函数式接口

本篇文章主要从三个方面对函数式接口进行描述,分别为定义、声明和用途。

定义

函数式接口(Functional Interface FI):只含有一个抽象方法的接口为函数式接口。

注:接口中的声明的方法,默认的修饰符是public abstract
接口中的定义的变量,默认的修饰符是public static final

声明

Java8提供了@FunctionalInterface注解, 为了让编译器帮助我们检查确保一个接口满足FI的要求,即接口中有且仅有一个抽象方法。

举个示例:
Java1.8中的Consumer接口如下:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
    
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

Consumer接口中有个默认方法,即函数式接口中可以定义默认方法。这得益于java8对于接口的增强。
同时函数式接口中可以定义静态方法以及重载Object类中的方法。

用途

函数式接口主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。

Lambda的语法表达格式为:

(parameters) -> expression
或
(parameters) ->{ statements; }

和内部类一样,Lambda也可以访问外部(词法作用域)变量,规则基本一样。Java8之前,内部类只能访问final类型的变量,Java8放宽了这种限制,只要变量实际上不可变(effectively final)就可以。换句话说,如果你给变量加上final关键字编译器也不报错,那么去掉final关键字后,它就是effectively final的。

下面的例子是调用Consumer接口中的accept方法。实现对于输入的数据的打印。

public static void test() {
        Consumer<int> consumer =  (x) -> {System.out.println(x);};
        consumer.accept(10);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值