一、表达式格式定义

(parameters) -> expression 或 (parameters) ->{ statements; }

注意点:左边是输入参数,就相当于我们定义方法中的形参,当形参只有一个时可与除掉括号;

    右边是方法的定义表达式语句,就相当于我们被包裹的方法体,里面包含了方法的具体实现,当只有一条语句时也是可以除去大括号的,方法的定义的位置就相当于我们变量的位置;

    我们方法有入参,方法体,返回体;我们返回体的定义则是在接口中定义的,lambda表达式要严格执行接口中方法的定义。

二、基本功能练习

  1.  
  1. @Test
    public void testLambda(){
    //函数定义
    MathOperation addMathOperation = (a, b) -> a+b;
    MathOperation subMathOperation = (a, b) -> a-b;
    MathOperation divMathOperation = (a, b) -> a/b;
    MathOperation mulMathOperation = (a, b) -> a*b;
    GreetService greetService = (message) -> System.out.println("hello"+message);
    GreetService greetService1 = message -> System.out.println("hello"+message);
    System.out.println("10 + 5 = " + this.mathOperationOperate(10, 5, addMathOperation));
    System.out.println("10 - 5 = " + this.mathOperationOperate(10, 5, subMathOperation));
    System.out.println("10 / 5 = " + this.mathOperationOperate(10, 5, divMathOperation));
    System.out.println("10 * 5 = " + this.mathOperationOperate(10, 5, mulMathOperation));
    greetService.sayMessage("有括号装饰");
    greetService1.sayMessage("无括号装饰");
    }
  2.  
  3. //函数接口定义
    interface MathOperation{
    int operate(int a, int b);
    }
  4.  
  5. interface GreetService{
    void sayMessage(String message);
    }
  6.  
  7. private int mathOperationOperate(int a , int b, MathOperation mathOperation){
    return mathOperation.operate(a,b);
    }
  8.  
  9. final static int a = 12;
    //1.注意点1:lambda 表达式只能引用标记了 final 的成员变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
    @Test
    public void testScope(){
    MathOperation scopeMathOperation = (c, b)->a+c+b;
    int scope = scopeMathOperation.operate(1,2);
    System.out.println("变量作用域测试"+scope);
    }
  10.  
  11. //2.我们可以在lambda表达式中访问局部变量
    @Test
    public void testScope1(){
    int a = 12;
    MathOperation scopeMathOperatin = (c, b) -> a+c+b;
    int scope = scopeMathOperatin.operate(1,2);
    System.out.println("变量作用域测试"+scope);
    }
  12.  
  13. //3lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义),引用的变量后期不可以更改
    @Test
    public void testScope2(){
    int a = 12;
    MathOperation scopeMathOperatin = (c, b) -> c+b;
    int scope = scopeMathOperatin.operate(1,2);
    System.out.println("变量作用域测试"+scope);
    a = 1;//会报错
    }
  14.  
  15. //4在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量
    @Test
    public void testScope3(){
    int a = 1;//编译异常
    MathOperation scopeMathOperatin = (a, b) -> a+b;
    int scope = scopeMathOperatin.operate(1,2);
    System.out.println("变量作用域测试"+scope);
    }
  1.  

三、总结

主要有三点

  1.lambda表达式格式要符合规则,多参数需要小括号包装,一个参数无需包装;多表达式需要大括号包装,单表达式无需包装。

  2.lambda表达式的应用要完全符合接口的定义,入参,函数体,返回参数。

  3.lambda参数的定义域,lambda只能访问外部标记了final的成员变量,lambda方法内布局变量一经引用不可修改有final意思,lambda表达式中不可以申明或应用两个同样的变量名。

lumbda表达式初探的更多相关文章

  1. Java Lambda表达式初探

    Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...

  2. Java8 Lumbda表达式 初步

    Java8 Lumbda表达式 初步 package com.stono.test; import java.util.function.BinaryOperator; public class Te ...

  3. 自己构建的Lumbda表达式

    自己构建的Lumbda表达式 定义接口: package com.stono.lambda; public interface Add { public void add(int x, int y); ...

  4. 学习日记-从爬虫到接口到APP

    最近都在复习J2E,多学习一些东西肯定是好的,而且现在移动开发工作都不好找了,有工作就推荐一下小弟呗,广州佛山地区,谢谢了. 这篇博客要做的效果很简单,就是把我博客的第一页每个条目显示在APP上,条目 ...

  5. Objective-C语法简记

    开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,现在来学Objective-C,这篇只是一些很简 ...

  6. 跟我一起学习ASP.NET 4.5 MVC4.0(五)(转)

    前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装.在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NE ...

  7. Objective-C语法简记学习

    開始学习iPhone开发了,尽管如今已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,如今来学Objective-C,这篇仅仅是一些非 ...

  8. .net软件反编译笔记

    在软件的破解及源码获取及重新编译的道路上会遇到一些问题,书此备查. 大名鼎鼎的Reflector以及开源的ILSPY都是.NET程序集的反编译利器,但是它们不能为你做全部的工作. 0x01: 遇到反编 ...

  9. 跟我一起学习ASP.NET 4.5 MVC4.0(五)

    前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装.在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NE ...

随机推荐

  1. 学习笔记-AngularJs(十)

    前面一直在说自定义指令,但是却一直没有一次系统地去了解,现在需要我们一起来学习如何去使用自定义指令,去丰富html标签.属性,实现多元化.多功能的标签(或是属性).辣么,啥是指令?要了解指令,首先需要 ...

  2. C语言一维数组定义及引用时括号[]内容

    一维数组定义:数组名[常量表达式] 一维数组引用:数组名[整型常量或整型表达式] *说明:常量表达式 > 整型表达式 > 整型常量 #define N 100 宏定义没有具体的数据类型, ...

  3. mysql-8.0.12-winx64 解压版安装(转)

    1.官网下载 https://dev.mysql.com/downloads/mysql/ 2.解压到一个合适的目录 3.配置环境变量 path : bin的目录(必须配置) MYSQL_HOME:m ...

  4. TCP/IP 数据包报文格式(IP包、TCP报头、UDP报头)(转)

    reference:http://blog.51cto.com/lyhbwwk/2162568                    https://blog.csdn.net/wangzhen209 ...

  5. python高级变量类型(元组,列表,字典, 字符串和重要方法)

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...

  6. angular2在ts中使用transform转换时间格式

    摘要:在angular1中我们可以在控制器中像下面那样使用filter: $filter('date')(myDate, 'yyyy-MM-dd'); 但是如何在angular2中在ts中使用自定义p ...

  7. 编译QFileSystemModel

    QT在windows系统下可以直接安装,但有些时候,可以只编译一个类,这里需要有一些需要注意的.下面是github路径:https://github.com/1171597779/compile_of ...

  8. noj快排

    1003.快速排序 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 给定一个数列,用快速排序算法把它排成升序.   输入 第一行是一个整数n(n不大于10000),表示要排序 ...

  9. 在Struts.xml中的result元素指的是:指定动作类的动作方法执行完后的结果视图.

    result结果集 上一篇文章主要讲Struts2框架(4)---Action类访问servlet这篇主要讲result结果集 在Struts.xml中的result元素指的是:指定动作类的动作方法执 ...

  10. ubuntu16.04+caffe+GPU+cuda+cudnn安装教程

    步骤简述: 1.安装GPU驱动(系统适配,不采取手动安装的方式) 2.安装依赖(cuda依赖库,caffe依赖) 3.安装cuda 4.安装cudnn(只是复制文件加链接,不需要编译安装的过程) 5. ...