目录

一、Lambda表达式

二、Lambda表达式与函数式接口

三、方法引用(java8新特性)


一、Lambda表达式

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),简化代码。

1、基础语法

()->{}, 即lambda参数列表 -> lambda要实现的功能(lambda体)。

(1)无参无返回值

  • () -> System.out.println("hello,lambda!");
  • Runnable task = () -> System.out.println("i am coming...");

JAVA list拉姆达求和 jdk8拉姆达表达式_JAVA list拉姆达求和

(2)有一个参数,无返回值

 (x) -> System.out.println(x);

(3)有一个参数,方法签名可以省略括号

x -> System.out.println(x);

JAVA list拉姆达求和 jdk8拉姆达表达式_函数式接口_02

(4)有两个以上的参数,有返回值,并且lambda体中有多条语句

   Comparator<Interger> com = (x,y)->{
        System.out.println("函数式接口");
        return Integer.compare(x,y);
    };

(5)若lambda只有一条语句,return和大括号可以省略不写

Comparator<Integer> com = (x,y) -> Integer.compare(x,y);

(6)Lambda表达式的参数列表的数据类型可以忽略不写,jvm可以通过编译器推断出上下文,数据类型,即"类型推断"
    (Integer x,Integer y) -> Integer.compare(x,y);

二、Lambda表达式与函数式接口

  • 函数式接口:只有1个抽象方法的接口,用@FunctionalInterface修饰。
  • 函数式接口好处:使用极简的lambda表达式 实例化函数式接口
  • lambda表达式仅仅适用于函数式接口!!!

例:编写一个实现函数式接口Comparator的java类,封装排序逻辑

//实现接口,重写方法
Collections.sort(list, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return Integer.compare(o1.getAge(), o2.getAge());
            }
        });

//使用lambda表达式 实例化函数式接口
Comparator<User> sortAsc = 
              (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge());
Collections.sort(list, sortAsc);

三、方法引用(java8新特性)

1、场景

有时,用lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作——此种场景,通过方法名调用。

2、方法引用分类

(1)静态方法的引用  类名::静态方法名

JAVA list拉姆达求和 jdk8拉姆达表达式_接口_03

(2)实例方法引用 对象::实例方法名

调用已经存在的实例的方法,与静态方法引用不同的是类要先实例化,静态方法引用类无需实例化,直接类名调用。

JAVA list拉姆达求和 jdk8拉姆达表达式_java_04

(3)对象方法引用  类名::实例方法名

lambda表达式参数列表第1个参数是实例方法第参数调用者,第2个参数是实例方法的参数,则使用 对象方法引用。

JAVA list拉姆达求和 jdk8拉姆达表达式_JAVA list拉姆达求和_05

(4)构造方法引用 类名::new

注:构造器参数列表 同 函数式接口中抽象方法的参数列表

JAVA list拉姆达求和 jdk8拉姆达表达式_JAVA list拉姆达求和_06