首页 /  技术专区  /  Java 宽屏模式 >

作为一个现代java程序员必会的知识——函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

每一个函数式接口都可以用lambda表达式来简化。

为什么说这玩意重要呢?在jdk1.5的时候三大特性我们必须要学会,泛型、枚举、注解,而作为一个现代java程序员,必须要会的是函数式接口,这个还是jdk1.8的特性,现在jdk已经发展到14了,各位小伙伴怎么可以连1.8的特性都不会呢?这时候又有一些小伙伴要说了,我也不会函数式接口,但这丝毫不影响我开发,那么问题来了,你不用,总会有别人用,新一代的框架大量使用函数式接口编程,如果不会这个玩意,估计以后看源码都看不懂了。

接下来是正题,我们下面讲解四个最经典的函数式接口吧。

1. 函数式接口

我们先来看一波源码:

image.png

看源码我们可以了解到,函数式接口有两个泛型,一个约定着入参类型,一个约定着返回值类型,我们代码实现一下,我们输入一串字符串,就让它返回这个字符串:

//函数式接口
Function<String, String> function1 = new Function<String, String>() {
    @Override
    public String apply(String str) {
        return str;
    }
};

调用一下上面的代码:

System.out.println(function1.apply("aaa"));

控制台打印:

image.png

我们上面说过,每一个函数式接口都可以用lambda表达式简化,下面我们来试一下用lambda表达式简化一下代码:

//lambda表达式优化
Function<String, String> function2 = (str) -> {return str;};
Function<String, String> function3 = str-> str;

System.out.println(function2.apply("bbb"));
System.out.println(function3.apply("ccc"));

 控制台打印:

image.png

2. 断定型接口

老规矩,源码走一波:

image.png

这下我们又突然恍然大悟,断定型接口就是只有一个入参,返回值为boolean类型,就TM你叫夏洛啊?就TM你叫断定型接口啊?

代码实现,我们来判断一下入参是否大于0,如果大于就返回true,否则返回false:

//断定式接口
Predicate<Integer> predicate = new Predicate<Integer>() {
    @Override
    public boolean test(Integer num) {
        return num > 0;
    }
};
//lambda简化
Predicate<Integer> predicate2 = (num) -> num > 0;

System.out.println(predicate.test(1));
System.out.println(predicate.test(-1));
System.out.println(predicate2.test(1));
System.out.println(predicate2.test(-1));

控制台打印:

image.png

3. 消费型接口

image.png

学完上面两个函数式接口,我相信聪明的小伙伴已经能看懂了,消费型接口,只有一个入参,没有返回值。

代码实现,让他在方法体里面输出我们入参给的数据:

//消费型接口
Consumer<String> consumer = new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
};
//lambda简化
Consumer<String> consumer2 = (str)->{System.out.println(str);};

consumer.accept("hello");
consumer2.accept("world");

控制台打印:

image.png

4. 供给型接口

image.png

供给型接口,只有返回值,没有入参,我估计现在有的小伙伴都能举一反三抢答了~很棒。

代码实现:

//供给型接口
Supplier<String> supplier = new Supplier<String>() {
    @Override
    public String get() {
        return "liqinglin";
    }
};
//lambda简化
Supplier<String> supplier1 = ()->{return "hahaha";};

System.out.println(supplier.get());
System.out.println(supplier1.get());

控制台打印:

image.png

好了,这就是比较常用的四种函数式接口,小伙伴是不是感觉很简单呢!


头像
0/200
图片验证码