Lambda表达式是java Stream的使用基础。java
lambda表达式的语法由参数列表、->和函数体组成。函数体既能够是一个表达式,也能够是一个语句块。表达式执行后会返回执行结果。语句块中使用return将控制权转给调用者。表达式函数体省略return,适用于小型表达式,使得语法更加简洁。函数
参数能够无参或多个参数,参数能够指定数据类型,参数放在()中,无参的状况下()中为空,单参能够不用();函数体能够为表达式或语句块,单个表达式也能够放在语句块中。优化
接口:spa
1 public interface OnClickListener { 2 void doOnClick(); 3 }
无参Lambda表达式:code
1 OnClickListener mListener = () -> System.out.println("do on Click"); 2 或 3 OnClickListener mListener_ = () -> { 4 System.out.println("插上电源"); 5 System.out.println("打开电视"); 6 };
单个参数的状况下,能够省略(),多参数的状况不能够省略。对象
1 OnItemClickListener mItemListener = position -> System.out.println("position = [" + position + "]"); 2 IMathListener mPlusListener = (x, y) -> x + y;
能够指定参数的类型,这时传入的参数类型必须匹配,不然编译错误。blog
1 IMathListener mSubListener = (int x, int y) -> x - y;
Lambda表达式中,修改方法体中引入的外部变量会报错,即Lambda表达式引用的是值而不是变量。接口
函数式接口是Java8中提供的一种特殊类型的接口,该接口中只定义了惟一的抽象方法,用做表达式的类型。下面是一个函数式接口的例子。字符串
1 public interface IMathListener { 2 int doMathOperator(int start, int plusValue); 3 }
下面用Lambda表达式声明了函数式接口IMathListener的实现。get
1 IMathListener mSubListener = (x, y) -> x - y; 2 mMaxListener.doMathOperator(10, 5));// 其值:5
对于函数接口而言,接口中惟一方法的命名并不重要了,只要方法签名和Lambda表达式的类别相匹配便可。但为了增长可读性,须要参数名称有意义。
现有的静态方法也能够支持Lambda表达式。
1 public class Math { 2 public static int doIntPlus(int start, int plusValue) { 3 return start + plusValue; 4 } 5 }
关联:函数签名同样就能够,经过函数调用,直接生成了一个IMathListener对象。
1 IMathListener mPlusListener = Math::doIntPlus;
Lambda表达式都是静态类型的,在编译器编译,因此被引用的方法必须是静态方法。
每一个用做函数接口的接口都应添加 @FunctionalInterface注释,该注释会强制 javac 检查一个接口是否符合函数接口的标准。若是该接口添加给枚举类型、类或函数不止一个的接口,javac会报错。
能够人工指定返回值数据类型。
1 overloadedMethod((x)->(String)y);
数据类型推导:Lambda表达式做为参数时,其类型由它的目标类型推导得出,规则以下。
总结:
使用Lambda表达式避免使用大量的匿名内部类,提升代码可读性。
Lambda表达式是匿名方法,旨在经过用轻量级机制替换匿名内部类的机制来解决“垂直问题”。
如下是lambda表达式的一些示例:
1 (int x, int y) -> x + y 2 3 () -> 42 4 5 (String s) -> { System.out.println(s); }
第一个表达式采用两个整数参数,名为and ,并返回它们的和。第二个不带参数并返回整数。第三个接受一个字符串并将其打印到控制台,什么都不返回。xy42
通常语法包括参数列表,箭头标记->
和正文。正文能够是单个表达式,也能够是语句块。在表达式中,简单地评估并返回正文。在块形式中,body被评估为方法体 - return
语句将控制权返回给匿名方法的调用者; break
而且continue
在顶级是非法的,但固然容许在循环中; 若是正文产生结果,则每一个控制路径必须返回一些内容或抛出异常。
语法针对lambda表达式很是小的常见状况进行了优化,如上所示。例如,表达式 - 体形式消除了对return
关键字的须要,不然关键字可能表明相对于表达式大小的实质语法开销。
还指望lambda表达式常常出如今嵌套上下文中,例如方法调用的参数或另外一个 lambda表达式的结果。为了在这些状况下最小化噪声,避免了没必要要的分隔符。可是,对于将整个表达式设置为有用的状况,能够用括号括起来,就像任何其余表达式同样。
如下是语句中出现的lambda表达式的一些示例:
1 FileFilter java = (File f) -> f.getName().endsWith(".java"); 2 3 String user = doPrivileged(() -> System.getProperty("user.name")); 4 5 new Thread(() -> { 6 connectToService(); 7 sendNotification(); 8 }).start();