zoukankan      html  css  js  c++  java
  • lambda expression

    Lambda表达式是java Stream的使用基础。

    lambda表达式的语法由参数列表、->和函数体组成。函数体既可以是一个表达式,也可以是一个语句块。表达式执行后会返回执行结果。语句块中使用return将控制权转给调用者。表达式函数体省略return,适用于小型表达式,使得语法更加简洁。

    参数可以无参或多个参数,参数可以指定数据类型,参数放在()中,无参的情况下()中为空,单参可以不用();函数体可以为表达式或语句块,单个表达式也可以放在语句块中。

    接口:

    1 public interface OnClickListener {
    2     void doOnClick();
    3 }

    无参Lambda表达式:

    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;

    可以指定参数的类型,这时传入的参数类型必须匹配,否则编译错误。

    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的实现。

    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); }
    第一个表达式采用两个整数参数,名为xand y,并返回它们的和。第二个不带参数并返回整数42。第三个接受一个字符串并将其打印到控制台,什么都不返回。

    一般语法包括参数列表,箭头标记->和正文。正文可以是单个表达式,也可以是语句块。在表达式中,简单地评估并返回正文。在块形式中,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();
  • 相关阅读:
    POJ3311Hie with the Pie(floyd传递+DP,状态压缩)
    POJ1185炮兵阵地(DP状态压缩)
    POJ3254Corn Fields (状态压缩or插头DP)
    eBPF Tracing 入门教程与实例
    因为 Java 和 Php 在获取客户端 cookie 方式不同引发的 bug
    DRDS 数据恢复重磅发布,全方位保障您的数据安全
    前沿 | 全球最具影响力开源数据库峰会开幕在即 阿里云精彩议题先睹为快
    MaxCompute 预付费标准版VS套餐版
    DTCC 2019 | 深度解码阿里数据库实现 数据库内核——基于HLC的分布式事务实现深度剖析
    从 Apache ORC 到 Apache Calcite | 2019大数据技术公开课第一季《技术人生专访》
  • 原文地址:https://www.cnblogs.com/vision-xixi/p/11066666.html
Copyright © 2011-2022 走看看