详解 Lambda表达式
Lambda表达式
概述:
Lambda 是一个匿名函数,
我们可以把 Lambda表达式理解为是一段可以传递的代码
(将代码像数据一样进行传递)
可以写出更简洁、更灵活的代码。
作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升
首先,本人要声明的一点是:
Lambda表达式仅适用于 函数式接口
(函数式接口:只含有一个抽象方法的接口)
那么,现在,本人就通过对于例子的简化,来讲解Lambda表达式的语法要求:
首先,本人来给出一个接口:
package edu.youzg.about_new_features.core.about_jdk8.core;
public interface MyInterface {
Object add(int a,int b);
}
那么,我们以往想要在使用这个接口的话,就要按如下的格式:
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Test {
public static void main(String[] args) {
MyInterface myInterface = new MyInterface() {
@Override
public Object add(int a, int b) {
return a + b;
}
};
System.out.println(myInterface.add(10, 20));
}
}
想必结果大家肯定都知道:

那么,在我们引入Lambda表达式的知识后,就可以化简为如下格式:
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Test {
public static void main(String[] args) {
//原始写法
MyInterface myInterface = new MyInterface() {
@Override
public Object add(int a, int b) {
return a + b;
}
};
System.out.println(myInterface.add(10, 20));
//Lambda表达式 * 一阶
MyInterface myInterface1 = (int a, int b) -> {
return a + b;
};
System.out.println(myInterface1.add(10, 20 ));
}
}
那么,我们来看一下运行结果:

其实,参数类型也可以省略不写:
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Test {
public static void main(String[] args) {
//原始写法
MyInterface myInterface = new MyInterface() {
@Override
public Object add(int a, int b) {
return a + b;
}
};
System.out.println(myInterface.add(10, 20));
//Lambda表达式 * 一阶
MyInterface myInterface1 = (int a, int b) -> {
return a + b;
};
System.out.println(myInterface1.add(10, 20 ));
//Lambda表达式 * 二阶
MyInterface myInterface2 = (a, b) -> {
return a + b;
};
System.out.println(myInterface2.add(10, 20 ));
}
}

令人惊叹的是:由于实现这个接口,我们只写了一行return,所以,源代码快还可以省去return和{} :
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Test {
public static void main(String[] args) {
//原始写法
MyInterface myInterface = new MyInterface() {
@Override
public Object add(int a, int b) {
return a + b;
}
};
System.out.println(myInterface.add(10, 20));
//Lambda表达式 * 一阶
MyInterface myInterface1 = (int a, int b) -> {
return a + b;
};
System.out.println(myInterface1.add(10, 20 ));
//Lambda表达式 * 二阶
MyInterface myInterface2 = (a, b) -> {
return a + b;
};
System.out.println(myInterface2.add(10, 20 ));
//Lambda表达式 * 三阶
MyInterface myInterface3 = (a, b) -> a + b;
System.out.println(myInterface3.add(10, 20 ));
}
}
那么,本人来展示下运行结果:

现在,本人来给出一个Model类:
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Model {
int value;
int number;
public Model(int value, int number) {
System.out.println("执行了双参构造");
this.value = value;
this.number = number;
}
public int getValue() {
return value;
}
public int getNumber() {
return number;
}
}
现在,若是本人想在该函数接口的抽象方法中返回一个刚申请对象的成员的值:
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Test {
public static void main(String[] args) {
//原始写法
MyInterface myInterface = new MyInterface() {
@Override
public Object add(int a, int b) {
Model model = new Model(a, b);
return model;
}
};
Model add = (Model) myInterface.add(1, 2);
System.out.println("value为:" + add.getValue() + "\r\nnumber为:" + add.number);
}
}
那么,我们可以转换为如下格式:
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Test {
public static void main(String[] args) {
//原始写法
MyInterface myInterface = new MyInterface() {
@Override
public Object add(int a, int b) {
Model model = new Model(a, b);
return model;
}
};
Model add = (Model) myInterface.add(1, 2);
System.out.println("value为:" + add.getValue() + "\r\nnumber为:" + add.number);
System.out.println("===================================");
//Lambda表达式 版本
MyInterface myInterface1 = Model::new;
Model add1 = (Model) myInterface.add(1, 2);
System.out.println("value为:" + add1.getValue() + "\r\nnumber为:" + add1.number);
}
}
现在,本人来展示下运行结果:

那么,对于这个转换,本人再来给出个例子:
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Test {
public static void main(String[] args) {
//原始写法
MyInterface myInterface = new MyInterface() {
@Override
public Object add(int a, int b) {
int min = Math.min(a, b);
return min;
}
};
System.out.println(myInterface.add(10, 20));
System.out.println("===================================");
//Lambda表达式 版本
MyInterface myInterface1 = Math::min;
System.out.println(myInterface1.add(10, 20));
}
}
那么,本人再来展示下运行结果:

上面两个例子分别是 构造方法、静态方法的返回,
那么,现在,本人再来展示最后一种可转换条件 —— 非静态方法:
package edu.youzg.about_new_features.core.about_jdk8.core;
public class Test {
public static void main(String[] args) {
//原始写法
MyInterface myInterface = new MyInterface() {
@Override
public Object add(int a, int b) {
Model model = new Model(a, b);
return model.plus(10, 20);
}
};
System.out.println(myInterface.add(10, 20));
System.out.println("===================================");
//Lambda表达式 版本
Model model = new Model(5, 1);
MyInterface myInterface1 = model::plus;
System.out.println(myInterface1.add(10, 20));
}
}
现在,本人来展示下运行结果:

那么,有关Lambda表达式的所有可能出现的例子在上面就展示完毕了。
那么,现在,本人来稍作总结:
操作符为 “ ->” , 该操作符被称为 Lambda 操作符或箭头操作符。
它将 Lambda 分为两个部分:
左侧: 指定了 Lambda 表达式需要的所有参数
右侧: 指定了 Lambda 体,即 Lambda 表达式要执行的功能。
方法引用:使用操作符 “ ::” 将方法名和对象或类的名字分隔开来
对象::实例方法
类::静态方法
类::实例方法
详解 Lambda表达式的更多相关文章
- Java8特性详解 lambda表达式 Stream
1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...
- Java8特性详解 lambda表达式 Stream【转】
本文转自http://www.cnblogs.com/aoeiuv/p/5911692.html 1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有 ...
- [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口
函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...
- Cron表达式详解和表达式的验证
本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...
- 详解Lambda
定义好委托: public delegate int FirDelegate(int a); public delegate int SecDelegate(int a,int b); public ...
- java8的新特性详解-----------Lamda表达式
java8最大的亮点就是引入了Lamda表达式 , 函数式编程的概念 具体啥意思我也不知道.只管用就行了,非常的强大,简洁,一个表达式相当于以前的十几行代码 因为之前要实现这种效果全靠if el ...
- 【jsp】详解JSP表达式语言(EL)
一.JSP EL语言定义 E L(Expression Language) 目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...
- [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决
1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算 ...
随机推荐
- intern()方法的使用
intern() intern方法的作用是:如果字符串常量池中已经包含一个字符串等于此String对象的字符串,则返回常量池中的这个String对应的对象, 否则将其添加到常量池并返回常量池中的引用. ...
- VMware workstation 下Hadoop伪分布式模式安装
详细过程: 1.VMware安装: 2.centos 6 安装 3.jdk下载安装配置 4.Hadoop 安装配置 1.VMware Workstation 安装: https://www.vmwar ...
- K 最近邻(k-nearest neighbours,KNN)算法
KNN用于分类和回归,需要考虑最近的邻居. 分类就是编组. 回归就是预测结果(如数字). 特征抽取意味着将物品(如水果或用户)转换为一系列可比较的数字. 能否挑选合适的特征事关KNN算法的 ...
- 深入理解NIO(四)—— epoll的实现原理
深入理解NIO(四)—— epoll的实现原理 本文链接:https://www.cnblogs.com/fatmanhappycode/p/12362423.html 终于来到最后了,万里长征只差最 ...
- ConcurrentHashMap红黑树的实现
红黑树 红黑树是一种特殊的二叉树,主要用它存储有序的数据,提供高效的数据检索,时间复杂度为O(lgn),每个节点都有一个标识位表示颜色,红色或黑色,有如下5种特性:1.每个节点要么红色,要么是黑色:2 ...
- Sublime Text 2 Install Package Debug
本文转载自CSDN空间freshlover的博客<Sublime Text 无法使用Package Control或插件安装失败的解决方法>,转载请注明出处,谢谢! Sublime Tex ...
- .Net 微服务架构技术栈的那些事
一.前言 大家一直都在谈论微服务架构,园子里面也有很多关于微服务的文章,前几天也有一些园子的朋友问我微服务架构的一些技术,我这里就整理了微服务架构的技术栈路线图,这里就分享出来和大家一起探讨学习,同时 ...
- VAuditDemo-文件包含漏洞的审计
包含漏洞 include.require等先关函数,include($file) 文件包含漏洞的问题在于参数可控(路径.文件名.后缀) include($path.$filename.$ext) 包含 ...
- vs中出现CL.exe已退出的情况总结
1.函数具有返回值 在定义时没有加上返回值 2.使用未初始化的内存 比如 #include<stdio.h> int main() { int a; printf("%d&quo ...
- ASP.NET Core技术研究-探秘依赖注入框架
ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...