lumbda表达式初探
一、表达式格式定义
(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表达式初探的更多相关文章
- Java Lambda表达式初探
Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...
- Java8 Lumbda表达式 初步
Java8 Lumbda表达式 初步 package com.stono.test; import java.util.function.BinaryOperator; public class Te ...
- 自己构建的Lumbda表达式
自己构建的Lumbda表达式 定义接口: package com.stono.lambda; public interface Add { public void add(int x, int y); ...
- 学习日记-从爬虫到接口到APP
最近都在复习J2E,多学习一些东西肯定是好的,而且现在移动开发工作都不好找了,有工作就推荐一下小弟呗,广州佛山地区,谢谢了. 这篇博客要做的效果很简单,就是把我博客的第一页每个条目显示在APP上,条目 ...
- Objective-C语法简记
开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,现在来学Objective-C,这篇只是一些很简 ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(五)(转)
前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装.在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NE ...
- Objective-C语法简记学习
開始学习iPhone开发了,尽管如今已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,如今来学Objective-C,这篇仅仅是一些非 ...
- .net软件反编译笔记
在软件的破解及源码获取及重新编译的道路上会遇到一些问题,书此备查. 大名鼎鼎的Reflector以及开源的ILSPY都是.NET程序集的反编译利器,但是它们不能为你做全部的工作. 0x01: 遇到反编 ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(五)
前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装.在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NE ...
随机推荐
- 禁用cookie后的方法
保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给 服务器.一般这个cookie的名字都是类似于SEEESIONID.但cookie可以被人为 ...
- 转载:escape,encodeURI,encodeURIComponent有什么区别?
escape unescape encodeURI decodeURI encodeURIComponent decodeURIComponent 这六个方法功能有关联,如果不清楚每一个的作用,很容易 ...
- 使用IntelliJ IDEA开发java web
前言:由于本人接触java语言时间还比较短,IDE工具eclipse还比较熟悉点,想试试用IntelliJ IDEA来开发java web项目来练练手! 一.下载安装篇 1.安装IntelliJ ID ...
- css图形——三角形
1.css图形简介 在浏览网页的时候,我们经常看见各种图形的效果,而但凡涉及到图形效果,我们第一个想到的就是用图片来实现.但是在前端开发中,为了网站的性能速度,我们都是秉承着少用图片的原生质. 因为图 ...
- 1091 N-自守数
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3×922=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守 ...
- QFileSystemModel中通过flags函数反应代码的层级思考
Qt的Model/View设计中,有一些隐藏的代码,它们大多放在私有类里,对于类的作用非常关键,体现着Qt的整体设计思想.然而,由于它们比较隐蔽,学习起来比较繁琐,受到人们的忽视.然而,体现设计思想, ...
- pass,break,continue的使用场景
# ### 关键字的使用 pass / break / continue # pass 过 起到占位的作用 if 5 == 5: pass print(123) # break 只能应用在循环当中 用 ...
- WebView性能、体验分析与优化
育新 徐宏 嘉洁 ·2017-06-09 20:03 在App开发中,内嵌WebView始终占有着一席之地.它能以较低的成本实现Android.iOS和Web的复用,也可以冠冕堂皇的突破苹果对热更新的 ...
- tail语法
本文介绍Linux下tail命令的使用方法.linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新 ...
- Qthread的使用方法
1:重载 run()函数 2:将对象移到Qthread对象中 Movetothread 该方法必须通过信号 -槽来激发.