lambda表达式的学习

1、lambda表达式是什么?
lambda表达式是一种函数式的编程方式,用来使代码更加简洁明了,而在java中的lambda表达式时实质上就是直接实现接口中的方法,大大简化调用某个接口中方法的操作。
2、什么时候使用lambda表达式?
根据java核心技术卷二里面所写,只有某个接口里面只有一个抽象方法的时候可以使用lambda表达式进行替换,核心在于接口,以及具有唯一的抽象方法,之所以要强调抽象方法,是因为java8中的新特性引入了接口中可以实现默认方法,而接口中如果有多个默认方法与一个抽象方法时,也是可以使用lambda表达式的。在stream类的源码中就有这样的实例如下:

public interface Predicate<T> {

    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

这是stream.filter中的断言源码,我们很多时候都使用lambda表达式来直接实现里面的test方法
3、如何使用lambda
1.无参的(也就是指接口中的方法没有参数)

package com.ahei.speciality2;

public interface Eatable {
    void  eat();
}

-----------------实现如下

package com.ahei.speciality2;

public class EatableDemo {
    public static void main(String[] args) {
        Eatable e=new EatableImpl();
        useEatable(e);
        //使用匿名内部类
        useEatable(new Eatable() {
            @Override
            public void eat() {
                System.out.println("一天");
            }
        });
        //使用lambda表达式
        useEatable(()->{
            System.out.println("一天两个苹果");
        });
    }
    private  static  void  useEatable(Eatable e){
        e.eat();
    }
}

2、有参数的(也就是指接口中的方法需要参数)
接口代码如下:

    int add(int x,int y);
}
具体测试:

package com.ahei.speciality4;

public class AddableDemo {
    public static void main(String[] args) {
        AddableImpl addable = new AddableImpl();
        useAddable(addable);
        //匿名内部类
        useAddable(new Addable() {
            @Override
            public int add(int x, int y) {
                return x+y;
            }
        });
        //lambda表达式
        useAddable((int a,int b)->{
            return a+b;
        });

    }
    private  static  void useAddable(Addable a){
        int sum=a.add(10,20);
        System.out.println(sum);
    }
}

4、lambda表达式的省略规则

  • 1.(圆括号里面为参数),有多个参数时需要用,隔开,可以不需要定义参数类型,但是有多个参数得
  • 时候,不能只省略一个参数类型
  • jvm会自动识别参数的类型,圆括号里面的值为空的时候,表示是一个空参数
  • 2.方法体只有一个表达式的时候可以不用{}和分号; ,同时系统会自动返回表达式的值,有多个表达式的时候
  • 需要用写在{里面},同时指定返回的值
  • 3.当参数只有一个得时候,可以省略(),
  • 4.如果有return的时候,省略{}和;的时候也要把return省略掉

5、lambda表达式与匿名内部类的区别
区别1:匿名内部类可以用来实现类,抽象类,接口,而lambda表达式只能简化具有一个抽象方法的接口,两者的使用范围不同
区别2:编译后,匿名内部类会生成一个带有$符号的class文件,而lambda表达式不会生成其他文件

欢迎指正!!!!!!

posted @ 2021-05-31 09:29  aheiccc  阅读(99)  评论(0编辑  收藏  举报