Java中的lambda表达式如何理解——精简

2022年05月12日 阅读数:4
这篇文章主要向大家介绍Java中的lambda表达式如何理解——精简,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

✌️✌️✌️在写以前,我在考虑是否要写这篇文章,然而当我查阅“lambda表达式”的相关内容的时候,我发现大量的文章都出现了冗余的现象,文章的篇幅过于夸张,严重影响了你们阅读的兴趣,所以我决定写一篇关于lambda表达式的文章,让你们可以在必定程度上对lambda表达式有必定的理解。但愿可以对你在Java的学习中起到必定的帮助。java

 

 

Lambda概述

Lambda表达式是JDK8开始后的一种新语法形式数组

做用:简化匿名内部类的代码写法ide

格式: 函数

(匿名内部类被重写方法的形参列表)->{
    被重写方法的方法体代码
}
注:->是语法形式,无实际意义

首先咱们先定义一个抽象类,经过匿名内部类重写其方法,再对其进行简化,比较两者之间有何变化:学习

使用Lambda表达式以前: spa

public static void main (String[] args){
    People p = new People(){
    @Override
    public void run(){
        System.out.println("小学生跑的很慢");
        }
    };
    p.run();    

}
abstract class People{
    public abstract void run();
}

使用Lambda表达式以后:code

People p = ()->{
    System.out.println("小学生跑的很慢");
};
//会出现报错

会出现报错,这是为何呢?缘由在于前面对于Lambda表达式的定义并不清晰,Lambda表达式并不能简化因此匿名内部类,其只能简化函数式接口匿名内部类的写法形式,且接口中有且仅有一个抽象方法,一般,咱们会再接口上加上一个@Functionalinterface注解,标记该接口必须是知足函数式接口。对象

 

真正意义上经过Lambda表达式简化: blog

@FunctionalInterface//加上这个注解必须是函数式接口,且只有一个抽象方法
interface People{
    void run();
}
//简化以前的匿名内部类
People p = new People(){
    @Override
    public void run(){
        System.out.println("小学生跑的很慢!");
    }
};
//简化以后
People p = () -> {
        System.out.println("小学生跑的很慢!");
};

另外,也能够将其做为参数代入方法中去使用:接口

//在原来的基础上定义一个pk方法
public static void pk(People p){
    System.out.println("跑步状况如何:")
    p.run();
}
//不使用Lambda的状况下:
pk(p);//须要在定义匿名内部类以后,将p代入;
//使用Lambda的状况:
People p = () -> {
        System.out.println("小学生跑的很慢!");
};
pk(() -> {
        System.out.println("小学生跑的很慢!");
});
//因为等号右边便是People建立的对象p,所以能够能够直接将其代入

Lambda的好处:

 Lambda是一个匿名函数,咱们能够把Lambda表达式理解为是一段能够传递的代码,它能够写出更简洁、更灵活的代码,做为一种更紧凑的代码风格,使Java语言表达能力获得了提高。

 

 

Lambda实战的做用 

在以前的学习过程当中,咱们学习过了Arrays的相关知识,其中有一个sort方法(能够将数组升序或降序排列),它其实也是接口类,而且只有一个抽象方法:

//精简以前:
Arrays.sort(grade,new Comparator<Integer>(){
    @Override
    public int compare(Integer o1,Integer o2){
        return o2 -o1;
}
});
//精简以后:
Arrays.sort(grade,(Integer o1,Integer o2) -> {
        return o2 -o1;
});

 

Lambda表达式省略规则 

  • 参数类型能够省略不写
//参考前面的实战例子
Arrays.sort(grade,(Integer o1,Integer o2) -> {
        return o2 -o1;
});
//省略参数类型以后
Arrays.sort(grade,( o1, o2){
        return o2 -o1;
});
  • 若是只有一个参数,参数类型能够省略,同时()也能够省略
//简单引用一个单个参数的例子,不须要了解其具体含义
btn.addActionListener((ActionEvent e) -> {
    System.out.println("我是简单的例子。");
});
//简化以后:
btn.addActionListener( e -> {
    System.out.println("我是简单的例子。");
});
  • 若是Lambda表达式的方法体代码只有一行代码。能够省略大括号不写,同时要省略分号
//参照上一条规则的例子
btn.addActionListener( e -> {
    System.out.println("我是简单的例子。");
});
//简化以后:
btn.addActionListener( e -> System.out.println("我是简单的例子。") );
  • 若是Lambda表达式的方法体代码只有一行代码。能够省略大括号不写。此时,若是这行代码是return语句,必须省略return不写,同时也必须省略";"不写
//参照第一条规则的代码
Arrays.sort(grade,(Integer o1,Integer o2) -> {
        return o2 -o1;
});
//简化以后:
Arrays.sort(grade,( o1, o2)-> o2 -o1);

 

创做不易,给个三连