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 ...
随机推荐
- 从swap说引用
C++的引用类型是个很奇妙的存在,比如下面这个例子: #include<iostream> using namespace std; void swap(int& a, int&a ...
- doxygen
//commndline: doxygen Doxyfile /**comment /* /** time diff@pre precondition@post endcondition@throw ...
- jQ如何选中被选中的单选按钮的值
alert($("label input[name=logintpye]:checked").val());
- 【Java集合系列】目录
2017-07-29 13:49:40 一.Collection的全局继承关系 二.系列文章 [Java集合系列一]ArrayList解析 备注: 1.ArrayList本质上就是一个数组,所有对外提 ...
- swift3笔记
备注:这里只是个人的观点,有的地方也是copy,多多指教,个人笔记,有侵犯你们版权的地方还望海涵!!! 个人觉得swift和OC最大的区别就是增加了许多现代化的东西,java里面的闭包,private ...
- fastTime从后台传过来显示格式的处理
1.可以在控制台用syso查看 QuestionFeedbackView qfv = on_LineManageService.getBringupHead(projectNo);//qfv是一个内含 ...
- Selenium+Eclipse+Python 环境搭建
第一步:安装Python 根据下面的地址,直接一键安装,全部默认方式. 下载地址:http://www.python.org/ftp/python/2.7.5/python-2.7.5.msi 安装到 ...
- JavaScript实现本地图片上传前进行裁剪预览
本项目支持IE8+,测试环境IE8,IE9,IE10,IE11,Chrome,FireFox测试通过 另:本项目并不支持Vue,React等,也不建议,引入JQuery和Vue.React本身提倡的开 ...
- Fiddler常用命令
几个常用的命令行方法使用: 查找对应响应码的数据包或请求类型的数据包: 输入“=post”将选择post的数据包并用蓝色底标色 输入:=502 查找服务器返回是图片类型的请求 输入 select im ...
- go example
一个简单的博客系统 https://github.com/pingguoxueyuan/gostudy/tree/master/blogger