Java 8新特性

  • 速度快
  • 代码少
  • 强大的Stream API
  • 便于并行
  • 最大化减少空指针异常:Optional
  • Nashorn引擎,允许在JVM上运行JS应用

Lambda是一个匿名函数

理解为可以传递的代码,使代码更简洁,更灵活,紧凑型代码风格,提高表达能力

@Test
public void test1(){
    Runnable r1 = new Runnable() {
        @Override
        public void run() {
            System.out.println("我爱北京天安门");
        }
    };
    r1.run();
    System.out.println("======");
    Runnable r2 = () -> System.out.println("我爱北京故宫");
    r2.run();
}

@Test
public void test2(){
    Comparator<Integer> c = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.compare(o1,o2);
        }
    };
    System.out.println(c.compare(12, 30));
    System.out.println("======");
    Comparator<Integer> c1 = (o1,o2) -> Integer.compare(o1,o2);
    System.out.println(c1.compare(32, 31));
    System.out.println("======");
    Comparator<Integer> c2 = Integer :: compare;
    System.out.println(c2.compare(32, 31));
}

Lambda 表达式的使用

(o1,o2) -> Integer.compare(o1,o2);

​ 格式:

​ Lambda 操作符 或 箭头操作符

  • 左边:Lambda 形参列表 (接口中的抽象方法的形参列表)

  • 右边:Lambda 体 (就是重写的抽象方法的方法体)

本质:作为接口的实例

函数式接口

  • 只包含一个接口的抽象方法,是函数式接口

  • 一个接口使用 @FunctionalInterface 注解,检查他是否是一个函数式接口,javadoc也会包含一条声明,做出说明

  • 函数式接口可以用Lambda表达式表示

函数式接口参数类型返回类型用途
Consumer消费性接口Tvoid对类型为T的对象应用操作,包含方法,void accept(T t)
Supplier供给型接口T返回类型为T的对象,包含方法:T get()
Function<T,R>函数式接口TR对类型为T的对象应用操作,并返回结果,结果是R类型的对象,R apply(T t)
Predicate断定式接口Tboolean确定类型为T的对象是否满足某约束,返回boolean值,包含方法:boolean test(T t)

补充:

BiFunction

UnaryOperator

BinaryOperator

BiConsumer

BiPredicate

Bi 	2个参数类型

方法引用

是Lambda表达式的延伸,lambda表达式作为函数式接口的实例,所以方法引用,就是函数式接口的实例

三种使用场景:

类 :: 静态方法

类::非静态方法

对象::非静态方法

构造器引用

::右边是构造器

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐