Java8 lambda表达式

来源:互联网 发布:网络上dm是什么意思 编辑:程序博客网 时间:2024/06/07 09:48

一、为什么使用lambda表达式
Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
例:对list对象进行排序,之前需要创建Comparator的匿名类,进行重写方法设置比较条件,现在用lambda表达式则将执行的代码块传进去,代码如下:

/*** 实体bean*/public class Student {    private int age;    private String name;    private double score;    public Student(int age, String name, double score) {        this.age = age;        this.name = name;        this.score = score;    }    public int getAge() {        return age;    }    @Override    public String toString() {        return "Student{" +                "age=" + age +                ", name='" + name + '\'' +                ", score=" + score +                '}';    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public double getScore() {        return score;    }    public void setScore(double score) {        this.score = score;    }}public class LambdaTest {    List<Student> list = Arrays.asList(            new Student(17,"Lily",88.8)            ,new Student(19,"Tom",55.8)            ,new Student(30,"Sony",66.8)            ,new Student(22,"Apple",77.8)            ,new Student(22,"Jack",89.8));    @Test    public void compareByAge(){        Collections.sort(list, new Comparator<Student>(){            @Override            public int compare(Student o1, Student o2) {                if(o1.getAge() == o2.getAge()){                    return o1.getName().compareTo(o2.getName());                }                return o1.getAge() - o2.getAge();            }        });    }    @Test    public void compareByAgeLambda(){        Collections.sort(list, (e1,e2) -> {            return  e1.getAge() - e2.getAge();        });    }}

二、lambda表达式语法
Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为
两个部分:
左侧: 指定了 Lambda 表达式需要的所有参数。
右侧: 指定了 Lambda 体,即 Lambda 表达式要执行的功能。
语法格式一:无参,无返回值,Lambda 体只需一条语句

Runnable r1 = ()->System.out.println("Hello World");

语法格式二:Lambda 需要一个参数

Consumer<String> fun = (args)->System.out.println(args);

语法格式三:Lambda 只需要一个参数时,参数的小括号可以省略

Consumer<String> fun = args->System.out.println(args);

语法格式四:Lambda 需要两个参数,并且有返回值

BinaryOperator<Long> bo = (x, y) -> {return x + y;}

语法格式五:当 Lambda 体只有一条语句时,return 与大括号可以省略

BinaryOperator<Long> bo = (x, y) -> x + y;

语法格式六:数据格式的省略

BinaryOperator<Long> bo = (Long x,Long y) -> {return x + y;}

类型推断
上述 Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。