<返回更多

玩转Java8 lambda表达式&函数式接口一

2021-03-15    
加入收藏

Lambda表达式简介

Lambda表达式是JAVA 1.8才开始有的重要功能,使用Lambda表达式可以替代匿名内部类,代码简洁易懂,提升工作效率。上代码:

玩转Java8 lambda表达式&函数式接口一

使用内部类和使用lambda实现代码量对比


函数式接口简介

有且只有一个抽象方法(可以包含default或static方法,但Object类除外)的接口是函数式接口。@FunctionlInterface就是用来指定某个接口必须是函数式接口。@FunctionalInterface不是必须的,只是告诉编译器检查这个接口,保证该接口只能包含一个抽象方法,否则就会编译出错。@FunctionalInterface主要是帮助程序员避免一些低级错误,比如多个抽象方法。


Java8 之前的函数式接口

java.util.Comparator //排序接口

java.lang.Runnable //线程无返回值接口

java.util.concurrent.Callable<V> //线程有返回值接口

java.lang.reflect.InvocationHandler //动态代理接口

等等......


常用的函数式接口

Java1.8函数式接口都在rt.jar的java.util.function包中,以下是经常用到的函数式接口(一定要熟记,其他的函数式接口都是在这些函数式接口上的扩展

):

名称

唯一抽象方法

备注

Consumer< T >

void accept(T t);

接收一个参数,无返回值,即数据消费接口

Predicate< T >

boolean test(T t);

接收一个参数,返回布尔值,即数据判断接口

Supplier< T >

T get();

无参数,有返回值,即数据获取接口

Function< T, R >

R Apply(T t);

接收T类型参数,返回R类型结果,即数据映射接口(一般输入和输出是不同类型的)

 

BiConsumer<T, U>

void accept(T t, U u);

接收两个输入,无返回值,数据消费接口

UnaryOperator<T> extends Function<T, T>

 

T accept(T t);

接收一个参数,有返回值,输入和输出是相同类型,即数据映射接口

BiFunction<T, U, R>

 

R apply(T t, U u);

接收2个输入,有返回值,输入和输出是不同类型,即数据映射接口

BinaryOperator<T> extends BiFunction<T,T,T>

 

T apply(T t, T u);

接收2个输入,有返回值,输入和输出是相同类型,即数据映射接口


自定义函数式接口

通过上面的学习我们已经知道函数式接口的定义和分类,接下来我们实战自定义函数式接口 。废话不多说,代码走起来。

定义一个无参无返回值的函数式接口

 

玩转Java8 lambda表达式&函数式接口一

代码示例1

定义包含default、static方法的无参有返回值的函数式接口

 

玩转Java8 lambda表达式&函数式接口一

代码示例2


定义有一个参数,无返回值的函数式接口

 

玩转Java8 lambda表达式&函数式接口一

代码示例3


自定义函数式接口测试

@Test
public void testMyFuncationInterface() {
    // 1.无参无返回值
    IBossService boss = () -> System.out.println(" invoke m3");
    boss.m3();

    // 2.无参有返回值
    IBossService3<String> boss3 = () -> "m3";
    boss3.m3();

    // 3.有参无返回值
    IBossService2<String> boss2 = e -> System.out.println("param:" + e);
    boss2.m3("lambda");

    // 4.有参有返回值
    IBossService4<String, Integer> boss4 = e -> 1;
    boss4.m3("lambda");


}


@FunctionalInterface
interface IBossService {
    static int m2() {
        return 2;
    }

    default void m1() {
        System.out.println("m1");
    }

    void m3();
}

@FunctionalInterface
interface IBossService3<R> {
    static int m2() {
        return 2;
    }

    default void m1() {
        System.out.println("m1");
    }

    R m3();
}

@FunctionalInterface
interface IBossService2<E> {
    static int m2() {
        return 2;
    }

    default void m1() {
        System.out.println("m1");
    }

    void m3(E e);
}

@FunctionalInterface
interface IBossService4<T, R> {
    static int m2() {
        return 2;
    }

    default void m1() {
        System.out.println("m1");
    }

    R m3(T t);
}
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>