Java8新特性Lambda表达式、函数式接口

什么是Lambda表达式,java8为什么使用Lambda表达式?

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。我们可以把 Lambda表达式理解为是 一段可以传递的代码。最直观的是使用Lambda表达式之后不用再写大量的匿名内部类,简化代码,提高了代码的可读性。

    // 启动一个线程,不使用Lambda表达式
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("启动一个线程");
        }
    }).start();

    //使用Lambda表达式,只需要一行代码
    new Thread(() -> System.out.println("启动一个线程")).start();

Lambda表达式的基本语法和格式

基本语法
  1. java8中引入了新的操作符”->”,称为箭头操作符或者lambda操作符,箭头操作符将lambda拆分为两部分,左侧:lambda表达式的参数列表,右侧:lambda表达式中的所需要执行的的功能(接口实现的功能代码)。
  2. lambda表达式需要“函数式接口”的支持,接口中只有一个抽象方法的接口称为函数式接口,可以使用注解@FunctionalInterface检查接口是否是函数式接口。
  3. lambda表达式的参数列表的数据类型可以省略不写,因为jvm编辑器可以通过上下文判断。
基本格式

① 无参数,无返回值。( ) -> System.out.println(“hello”)

    // 实现Runnable接口(无参,无返回)
    Runnable r = () -> System.out.println("hello lambda");

② 一个参数(小括号可以省略不写,习惯上加上小括号),无返回值。(x) -> System.out.println(x)

    //Consumer接口(一个参数,无返回值),之后会提到
    //第一种,小括号不省略
    Consumer<String> c = (x) -> System.out.print(x);
    c.accept("hello");
    //小括号省略
    Consumer<String> c1 = x -> System.out.print(x);
    c1.accept("hello")

③ 有多个参数,并且lambda有多条语句,则lambda语句必须用大括号括起来并有return返回(若有一条语句则可以省略大括号和return),有返回值。(x,y) ->{System.out.println(“hello”);return Integer.compare(x, y);};

    //Comparator接口
    //多条语句
    Comparator<Integer> comparator = (x,y) ->{
        System.out.println("hello");
        return Integer.compare(x, y);
    };
    //一条语句
    Comparator<Integer> comparator2 = (x,y) -> Integer.compare(x, y);
    System.out.println(comparator2.compare(23, 22));

还有其他的一些格式都是大同小异,这里就不再了解。

函数式接口是什么?

在前面也提到了函数接口,那么函数接口到底是什么呢?是个接口,只包含一个抽象方法,那么它就是函数式接口,我们可以在任意函数式接口上使用 @FunctionalInterface 检查它是否是一个函数式接口。
函数式接口里是可以包含默认方法、静态方法,他们不是抽象方法;也可以包含Java.lang.Object里的public方法,因为任何一个类都继承Object类,包含了来自java.lang.Object里对这些抽象方法的实现,也不属于抽象方法;函数式接口里允许子接口继承多个父接口,但每个父接口中都只能存在一个抽象方法,且必须的相同的抽象方法。

Java8内置函数式接口

四大核心函数式接口
函数式接口方法参数类型返回类型作用
Consumer<T> 消费型接口void accept(T t)Tvoid对T类型的参数进行操作
Supplier<T> 供给型接口T get()T操作数据,返回T类型的结果
Function<T, R> 函数型接口R apply(T t)TR对T类型参数进行操作,并返回R类型的结果
Predicate<T> 断定型接口boolean test(T t)Tboolean确定T类型参数是否满足某约束,并返回boolean值
    //Consumer<T> 消费型接口
    @Test
    public void test1(){
        Consumer<String> c = (x) -> System.out.println("hello:"+x+"!");
        c.accept("Java");
    }
    // Supplier<T> 供给型接口
    @Test
    public void test2(){
        Supplier<String> s = () -> "hello,beautiful girl";
        String str = s.get();
        System.out.println(str);
    }
    //Function<T,R> 函数性接口
    @Test
    public void test3(){
        Function<String, Integer> f= (x) -> x.length();
        Integer len = f.apply("hello");
        System.out.println(len);

    }
    //Predicate<T> 断言型接口
    @Test
    public void test4(){
        Predicate<String> p = (x) -> x.length()>5;
        boolean b = p.test("hello Java");
        System.out.println(b);
    }
其它函数式接口
函数式接口方法参数类型返回类型作用
BiFunction<T , U, R >R apply(T t, U u)T, UR对 T, U 类型的参数进行操作,并返回R类型的结果
UnaryOperator<T> (Function 子接口)T apply(T t)TT对 T类型的参数进行一元运算,并返回R对象的结果
BinaryOperato<T,R> (BiFunction 子接口) )T apply(T t1, T t2)T, TT对T类型的参数进行二元运算,并返回T类型的结果
BiConsumer<T, U>void accept(T t, U u)T, Uvoid对T,作
ToIntToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T>int(long,double) applyAsInt(T value)Tint, long, double计 算 int 、 long 、double值的函数
IntFunction<R> LongFunction<R> DoubleFunction<R>R apply(int(long,double) value)int, long, doubleR参数分别为int、long、double 类型的函数
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值