一、表达式格式定义

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

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

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

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

二、基本功能练习


@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("无括号装饰");
} //函数接口定义
interface MathOperation{
int operate(int a, int b);
} interface GreetService{
void sayMessage(String message);
} private int mathOperationOperate(int a , int b, MathOperation mathOperation){
return mathOperation.operate(a,b);
} 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);
} //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);
} //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;//会报错
} //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.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. asp.net core2.1 bundleconfig.json合并压缩资源文件

    在asp.net core中则可以使用BuildBundlerMinifier来进行css,js的压缩合并 1.使用NuGet安装 BuildBundlerMinifier(也可以在vs中下载安装扩展 ...

  2. position的sticky与fixed

    fixed(固定定位) 生成绝对定位的元素,相对于浏览器窗口进行定位.元素的位置通过 "left", "top", "right" 以及 & ...

  3. 防止asp马后门

    好多朋友都拿的有webshell吧,基本上都加了密的...  可是,没见到源码,很难测试它到底有没有后门, 指不定给别人打工了...  下面贴种很简单的方法,大家别扔蛋哈 (asp的哦)  在代码的最 ...

  4. servlet邮箱激活验证实例含代码

    也有很多人本来有机会的,他们都拒绝了,不想让自己太累,太麻烦.或者中途被情绪所左右,半途而废了. 成长是有代价的,同样悠闲也是有代价的. 流程: 用户填写相关信息,点击注册按钮 系统先将用户记录保存到 ...

  5. Neo4j图数据库使用

    最近在处理一些图的数据,主要是有向图,如果图的节点不是特别大可以直接加载到内存里来处理,但是当图的节点个数特别大时,内存就放不下了:我 们牵涉到的图的节点数最大可以达到数亿个节点,已经超出的机器内存的 ...

  6. keil的可烧写hex文件生成

    右键Target1 Options Target for ‘Target1’ ...->Output->Create Executable:->Create HEX File Bui ...

  7. 剑指Offer 43. 左旋转字符串 (字符串)

    题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=&quo ...

  8. $inject

    function breadcrumb($parse, store) { } // 为了压缩 breadcrumb.$inject = ['$parse', 'breadcrumbStore']

  9. ScriptManager 发送错误到客户端

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  10. c#利用ApplicationContext类 同时启动双窗体的实现

    Application类(位于System.Windows.Forms命名空间)公开了Run方法,可以调用该方法来调度应用程序进入消息循环.Run方法有三个重载 1.第一个重载版本不带任何参数,比较少 ...