lambda 表达式

  lambda 表达式是可传递代码块,可在以后执行一次或多次;

1,lambda 语法:

  • 参数, 箭头(->) 以及一个表达式。如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,把这些代码放在 {}中, 并包含显式的 return语句。
  • 如果可以推导出一个 lambda 表达式的参数类型,则可以忽略其类型。
  • 即使 lambda 表达式没有参数, 仍然要提供空括号。
  • 方法只有一 参数, 而且这个参数的类型可以推导得出,那么甚至还可以省略小括号。
  • 如果一个 lambda 表达式只在某些分支返回一个值, 而在另外一些分支不返回值, 这是不合法的。例如,(int x)-> { if(x >= 0) return 1; } 就不合法。

2,函数接口(接口中只有一个抽象方法)可以使用lambda表达式替代。如:Comparator 接口;

  根据定义,任何有一个抽象方法的接口都是函数式接口。不 过使用 @FunctionalInterface 注解确实是一个很好的做法。

  

  Predicate<T> 接口,这个接口专门用来传递 lambda 表达式。

3,方法引用:

  要用 “::”  操作符分隔方法名与对象或类名,有三种情况:

    object::instanceMethod 实例方法引用;(例如,方法引用等价于提供方法参数的 lambda 表达式。类似地,Math::pow 等价于(x,y) -> Math.pow(x, y。)

    Class::staticMethod 类静态方法引用;(例如,方法引用等价于提供方法参数的 lambda 表达式。类似地,Math::pow 等价于(x,y) -> Math.pow(x, y。)

    Class/.instanceMethod  第 1 个参数会成为方法的目标。(例如,String::compareToIgnoreCase 等 同于 (x, y) -> x.compareToIgnoreCase(y) 0)

4,构造器引用

  构造器引用与方法引用很类似,只不过方法名为 new。

  可以用数组类型建立构造器引用。例如, int[]::new 是一个构造器引用,它有一个参数: 即数组的长度。这等价于 lambda 表达式 x -> new int[x]。

  Java 有一个限制,无法构造泛型类型 T 的数组。

5,lambda 变量:

  • lambda 表达式可以捕获外围作用域中变量的值。
  • lambda 表达式中, 只能引用值不会改变的 变量。
  • lambda 表达式中捕获的变量必须实际上是最终变量 ( effectively final) 实际上的最终变量是指, 这个变量初始化之后就不会再为它赋新值。
  • lambda 表达式的体与嵌套块有相同的作用域。这里同样适用命名冲突和遮蔽的有关规 则。在 lambda 表达式中声明与一个局部变量同名的参数或局部变量是不合法的。
  • 在一个 lambda 表达式中使用 this 关键字时, 是指创建这个 lambda 表达式的方法的 this 参数。

6,lambda 表达式的处理:

  1. 使用 lambda 表达式的重点是延迟执行 (deferred execution )。需要延迟执行的场景如下:

    在一个单独的线程中运行代码。

    多次运行代码。

    在算法的适当位置运行代码。

    发生某种情况时执行的代码。

 

 

 

 

 

 


 

posted @ 2019-12-02 15:31  Baby~She  阅读(130)  评论(0)    收藏  举报