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 ...
随机推荐
- Python3+PyCharm+Django+Django REST framework开发教程
一.说明 自己一是想跟上潮流二是习惯于直接干三是没有人可以请教,由于这三点经常搞得要死要活.之前只简单看过没写过Diango,没看过Django REST framework,今天一步到位直接上又撞上 ...
- 那些令人迷惑的名词:切图/H5/XML/REST
长时间以来对一些名词感到很困惑,不明白其具体指什么,在此记录一下. 一.切图 1.1 原先理解 从字面意思理解,切图是指将一张大的图切割成很多张小的图片.最早(视频教程网或者我要自学网)看到的视频也是 ...
- Chained Exceptions in Java
1. Overview In this article, we’ll have a very brief look at what Exception is and go in depth about ...
- 数据分析---SQL(Access数据库)
1. SQL(Structure Quest Language) 一种结构化查询语言,它是一种通用的关系型数据库操作语言,用于存取数据,查询,更新和管理数据库. 2. 基本语句 Select, Cre ...
- HttpsessionListener 实现在线人数统计
最近在学servlet jsp,用的林信良先生的 jsp&servlet 这本书,在第五章有道在线人数统计的课后题完成,做一次记录. 实际效果: 一:用户类: package cc.openh ...
- day72 关于rbac组件的小部分面试题
rbac的权限组件 基于角色的权限控制 1.什么是权限? url代表的就是一个权限 2.如何实现权限的控制? 表结构 以我们讲的课的内容为例 菜单表: - title 标题 - icon 图标 ...
- mysql group_concat(column) 函数替换成 oracle wm_concat(colum)
11gr2和12C上已经摒弃了wm_concat函数,所以只能手动创建该函数 解决办法: 一.解锁sys用户 alter user sys account unlock; 二.创建包.包体和函数 以s ...
- 1093 字符串A+B
给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集.要求先输出 A,再输出 B,但重复的字符必须被剔除. 输入格式: 输入在两行中分别给出 A 和 B,均为长度不超过 106 ...
- BiLstm原理
Lstm这里就不说了,直接说Bilstm. 前向的LSTM与后向的LSTM结合成BiLSTM.比如,我们对“我爱中国”这句话进行编码,模型如图所示. 前向的依次输入“我”,“爱”,“中国”得到三个向量 ...
- quora 的东西就是不一样
Coding is just a part of process of problem solving, You should need to understand the underlying pr ...