现在的位置: 首页 > 架构设计 > 正文

Lambda是什么意思?有什么用法

2020年02月17日 架构设计 ⁄ 共 2603字 ⁄ 字号 评论关闭

  Lambda表达式是JDK8新增的特性 下面的图就是JDK8的新特性,JDK5和JDK8相对来说都是比较重要有的Java版本。

  所以学习使用其中的新特性也是比较重要的。

  Lambda简介

  Lambda表达式指的是应用在单一抽象方法接口环境下的一种简化定义形式,可以用来解决匿名内部类的定义复杂问题。

  今天这篇讲的是lambda表达式,它是一种新的语法规则。它是一种匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。它可以写出更简洁、更灵活的代码。作为一种更紧凑简洁的代码风格,使 Java 语言的表达能力得到了提升。

  Lambda简单入门

  interface Message {

  public void print();

  }

  public class TestDemo {

  public static void main(String[] args){

  //lambda表达式,这里是覆写接口中的print方法

  fun() -> System.out.println("hello world");

  //原来的写法

  // fun(new Message(){

  // @Override

  // public void print)() {

  // System.out.println("hello world");

  //}

  //});

  }

  public static void print(Message msg){

  msg.print();

  }

  }

  Lambda用法

  Lambda的基本语法如下:

  (参数) -> 方法体/lambda体

  解析:

  左边是成员列表/形参列表(有时就是接口中的抽象方法的方法引用)。

  右边的方法体是要重写的抽象方法的方法体。

  -> 是操作符,也叫做lambda箭头操作符。

  简单示例

  // 1. 不需要参数,返回值为

  () -> 1

  // 2. 接收一个参数(数字类型),返回其2倍的值

  x -> 2 * x

  // 3. 接受2个参数(数字),并返回他们的差值

  (x, y) -> x – y

  // 4. 接收2个int型整数,返回他们的和

  (int x, int y) -> x + y

  // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)

  (String s) -> System.out.print(s)

  具体使用方法/写法-一共可以分为六种情况去写。

  /**

  * @Author: yhy

  * @Time: 22:37

  * 用来测试使用lambda语句

  */

  public class LambdaDemo {

  // -> lambda操作符

  // 情况一:无参且无返回值

  @Test

  public void test1() {

  // 原来的写法

  Runnable r0 = new Runnable() {

  @Override

  public void run() {

  System.out.println("abc");

  }

  };

  // lambda写法

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

  r.run();

  }

  //情况二 需要一个参数,但没有返回值

  // 原始写法

  Consumer con = new Consumer<>() {

  @Override

  public void accept(String s) {

  System.out.println(s);

  }

  };

  // lambda写法

  Consumer con2 = (String s) -> {

  System.out.println(s);

  };

  //情况三:数据类型省略,可推断出类,又叫做类型推断 前面已经知道是string类型了

  // 所以这里直接省略了后面的括号的string类型说明

  // 和泛型的格式很像,可以省略后面的类型说明

  Consumer con3 = (s) -> {

  System.out.println(s);

  };

  // 情况四:一个参数的时候, 括号可以不写 下面的s就是一个参数

  @Test

  public void test2() {

  Consumer con4 = s -> {

  System.out.println(s);

  };

  con4.accept("abcdefg");

  }

  // 情况五:需要两个或者以上的参数,且方法中多条执行语句,并且有返回值

  @Test

  public void test3() {

  // 原来的写法

  Comparator com = new Comparator() {

  @Override

  public int compare(Integer o1, Integer o2) {

  System.out.println(o1);

  System.out.println(o2);

  return o1.compareTo(02);

  }

  };

  System.out.println(com.compare(13,15));

  // lambda表达式

  System.out.println("------------------");

  Comparator com2 =(o1,o2) -> {

  return o1.compareTo(02);

  };

  System.out.println(com2.compare(14,12));

  }

  // 情况六:当lambda只有一条语句时候,可以在lambda体中省略括号和return

  @Test

  public void test4(){

  // 原来的写法

  Comparator com1 = (o1,o2) -> {return o1;};

  }

  // lambda规则六表达式写法

  Comparator com2 = (o1, o2) -> o1;

  }

  好处

  能够简洁,快速写代码,看的出代码量差别,但是有一说一,有时不会很好懂,但是看得懂还是最基本的要求。

  总结

  表达式的左边:Lambda形参列表的参数类型可以省略,如果只有一个参数的时候,也可以省略括号。

  表达式的右边:Lambda体,一对{}包裹着,只有一条执行语句的时候,也可以省略大括号,若有返回值,省略的时候也可以省略return。

  最后,以前用匿名内部类的地方都可以使用Lambda表达式类代替。

抱歉!评论已关闭.