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

Posted 石原里美的微笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的lambda表达式如何理解——精简相关的知识,希望对你有一定的参考价值。

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

 

 

Lambda概述

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

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

格式: 

(匿名内部类被重写方法的形参列表)->
    被重写方法的方法体代码

注:->是语法形式,无实际意义

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

使用Lambda表达式之前: 

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表达式之后:

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

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

 

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

@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);

 

创作不易,给个三连 

以上是关于Java中的lambda表达式如何理解——精简的主要内容,如果未能解决你的问题,请参考以下文章

java理解和运用Java中的Lambda

Python面试必考重点之列表,元组和字典第十二关——如果列表元素是字典序列,如何利用lambda表达式对列表进行升序降序排列

Java Lambda表达式的箭头理解总结

Java Lambda表达式的箭头理解总结

测码学院如何理解python中的lambda表达式并使用

java--lambda表达式