一Lamdba表达式一篇足够

Posted Java码农社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一Lamdba表达式一篇足够相关的知识,希望对你有一定的参考价值。

Lamdba表达式一篇足够

一、概述

1、是什么

Lambda表达式是一个匿名函数,即没有函数名的函数。也可以理解成是一段可以传递的代码(将代码像数据一样进行传递),这样一来代码更加简洁。

2、为什么

  • 代码简洁

  • 可能还有一些优化,但是目前没研究,研究到的时候再来补充。

二、语法组成

param -> body

1.中间以 -> 隔开形成左右两部分。我们称->为箭头操作符。

2.表达式左边:Lambda表达式的参数列表。

3.表达式右边:Lambda表达式中所需执行的功能,即Lambda体。

三、语法格式

1、无参无返回

方法没参数且没返回值,比如public void test() {System.out.println("hello")},用lambda表达式,首先看我们的Lambda组成公式:param -> body无参就用()代替,那么就是() -> body方法体是输出语句,所以:() -> System.out.println("hello")别问我方法名称在哪?第一个就说了,匿名函数,即没有函数名的函数。

2、一参无返回

方法有一个参数且没返回值,比如:public void test(int a) {System.out.println(a)},用lambda表达式,首先看我们的Lambda组成公式:param -> body有参数就放到()里就行了,那么就是(int a) -> System.out.println(a)

值得注意的是:1.若参数只有一个,则我们可以省略小括号,如下:

int a -> System.out.println(a)

2.我们可以省略参数类型,因为jdk会为我们自动推断。如下:

a -> System.out.println(a)

3、多参无返回

方法有一个以上参数且没返回值,比如:public void test(int a, String b) {System.out.println(a + ":" + b)},用lambda表达式,首先看我们的Lambda组成公式:param -> body有参数就放到()里就行了,那么就是(int a, String b) -> {System.out.println(a + ":" + b)}

值得注意的是:1.若参数只有一个,则我们可以省略小括号,但是一个以上就不能省略了。

2.我们可以省略参数类型,因为jdk会为我们自动推断。如下:

(a, b) -> {System.out.println(a + ":" + b)}

4、多参有返回

方法有一个以上参数且有返回值,比如:public String test(int a, String b) {return a + ":" + b},用lambda表达式,首先看我们的Lambda组成公式:param -> body有参数就放到()里就行了,那么就是(int a, String b) -> {return a + ":" + b}

值得注意的是:1.若参数只有一个,则我们可以省略小括号,但是一个以上就不能省略了。

2.我们可以省略参数类型,因为jdk会为我们自动推断。如下:

(a, b) -> {return a + ":" + b}

5、体只有一条

首先看我们的Lambda组成公式:param -> body体只有一条的意思是body只有一条语句。多条语句不可省略这种情况下我们可以省略{},且不管你有无返回值都可以省略return。多条语句不可省略。比如:public void test(int a) {System.out.println(a)}会写成: a -> System.out.println(a)比如:public int test(int a) {return a + 100}会写成: a -> a + 100

四、实战演示

1、无参无返回

/**
* 无参无返回,我们以Runnable接口为例,因为Runnable的run()方法就是无参无返回的。
*/
private static void test1() {
   Runnable runnable = new Runnable() {
       @Override
       public void run() {
           System.out.println("test1");
       }
   };
   runnable.run();
}

public static void main(String[] args) {
   test1();
   /**
    * lambda的方式重写无参无返回。
    * 说明一下:这里的无参无返回指的是Runnable接口的run方法无参无返回,至于细节问题,先不管,下一章节你秒懂。
    * 现在你只需要知道lambda真的很简单!
    */
   Runnable runnable = () -> System.out.println("test1");
   runnable.run();
}

2、一参无返回

/**
* 一参无返回
*/
private static void test2(int a) {
   System.out.println("a=" + a);
}

public static void main(String[] args) {
   test2(1);
   /**
    * lambda的方式重写一参无返回。
    * 说明一下:这里的无参无返回指的是Consumer接口的accept方法一参无返回,你会问Consumer是什么,先不管,下一章节你秒懂。
    * 现在你只需要知道lambda真的很简单!
    */
   Consumer<Integer> consumer = (a) -> System.out.println("a=" + a);
   consumer.accept(1);
   //---------------------------一参可省略小括号-----------------------------------//
   Consumer<Integer> consumer2 = a -> System.out.println("a=" + a);
   consumer2.accept(1);
}

// 多参无返回同理,不写了。,直接搞多参有返回吧

3、多参有返回

public static void main(String[] args) {
   /**
    * 多参有返回,这里拿比较接口来做案例
    */
   Comparator<Integer> comparator2 = new Comparator<Integer>() {
       @Override
       public int compare(Integer o1, Integer o2) {
           System.out.println("多参有返回");
           return Integer.compare(o1, o2);
       }
   };
   /**
    * lambda的方式重写多参有返回。
    * 说明一下:这里的多参无返回指的是Comparator接口的compare方法多参有返回,细节先不管,下一章节你秒懂。
    * 现在你只需要知道lambda真的很简单!
    */
   Comparator<Integer> comparator = (a, b) -> {
       // 需要注意的是:body多行,{}不能省略。
       System.out.println("多参有返回");
       return a.compareTo(b);
   };
}

五、总结

本章要学会以下东西

  • 什么是lambda

  • 为什么用lambda

  • lambda语法组成

  • lambda语法格式

  • 并不要求你会用

  • 要明白真的节省代码,如下:对接口的创建匿名内部类的实现时,只需一句话,比如:

Runnable r = () -> System.out.println("hello");

而具体什么样的接口能用lambda呢?我们随便写个interface的话可以用吗?显然不行,这就引人深思了,为什么案例中的Runnable和Comparator接口都可以用lambda替代其内部类的实现?留个伏笔,大家看源码的话能找到答案,提示:类注解。

好吧,对不起我这标题了,一篇确实不够。还需要函数式接口,与lambda相依为命的东西。下一篇我会着重讲解函数式接口这个老东西!他是Java8的核心之一。不管lambda写法还是streams都与函数式接口脱离不了关系。

现在大家看的可能有一点蒙,没关系,看完下篇在回想起来你就明白什么叫lambda、该怎么用了。lambda的文章确实很难写,真心的...比想象的难很多,一下子不知道怎么写了。发现没有函数式接口的讲解的话根本搞不定。

三、广告

https://gitee.com/geekerdream/


以上是关于一Lamdba表达式一篇足够的主要内容,如果未能解决你的问题,请参考以下文章

第二十一节——Lamdba表达式与函数式接口

Java8 Lamdba表达式 003

Lamdba表达式----针对数据库操作

lamdba表达式

Java8 Lamdba表达式 002

Java8 新特性 Lamdba表达式的一些简单用法