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表达式的更多相关文章

  1. Java8特性详解 lambda表达式 Stream

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

  2. Java8特性详解 lambda表达式 Stream【转】

    本文转自http://www.cnblogs.com/aoeiuv/p/5911692.html 1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有 ...

  3. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  4. Cron表达式详解和表达式的验证

    本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...

  5. 详解Lambda

    定义好委托: public delegate int FirDelegate(int a); public delegate int SecDelegate(int a,int b); public ...

  6. java8的新特性详解-----------Lamda表达式

    java8最大的亮点就是引入了Lamda表达式  , 函数式编程的概念  具体啥意思我也不知道.只管用就行了,非常的强大,简洁,一个表达式相当于以前的十几行代码  因为之前要实现这种效果全靠if el ...

  7. 【jsp】详解JSP表达式语言(EL)

    一.JSP EL语言定义 E L(Expression Language)  目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...

  8. [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. 刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

    1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算 ...

随机推荐

  1. 一文看懂NLP神经网络发展历史中最重要的8个里程碑!

    导读:这篇文章中作者尝试将 15 年的自然语言处理技术发展史浓缩为 8 个高度相关的里程碑事件,不过它有些偏向于选择与当前比较流行的神经网络技术相关的方向.我们需要关注的是,本文中介绍的许多神经网络模 ...

  2. 如何实现浏览器的Console功能

    离 JS-Encoder 的最初版本发布已经过了大半年的时间,这段时间除了偶尔修复一下 BUG 外,主要还是忙于学业.最近一段时间不太平,开学时间也大大延迟,加上自己本身对自己的在线编译器不是很满意, ...

  3. c++中的多态机制

    目录 1  背景介绍 2  多态介绍 2-1  什么是多态 2-2  多态的分类 2-3  动态多态成立的条件 2-4  静态联编和动态联编 2-5  动态多态的实现原理    2-6   虚析构函数 ...

  4. iOS 真机查看沙盒目录

    iExplorer 的方法试的时候设备都无法检测到,建议放弃 启用iTunes文件共享,才能够看沙盒内的文件,只需要在plist文件中添加如下信息: <key>UIFileSharingE ...

  5. spring boot 装载自定义yml文件

    yml格式的配置文件感觉很人性化,所以想把项目中的.properties都替换成.yml文件,蛋疼的是springboot自1.5以后就把@configurationProperties中的locat ...

  6. Spring中的设计模式:工厂方法模式

    导读 工厂方法模式是所有设计模式中比较常用的一种模式,但是真正能搞懂用好的少之又少,Spring底层大量的使用该设计模式来进行封装,以致开发者阅读源代码的时候晕头转向. 文章首发于微信公众号[码猿技术 ...

  7. LFU五种实现方式,从简单到复杂

    前言 最近刷力扣题,对于我这种 0 基础来说,真的是脑壳疼啊.这个月我估计都是中等和困难题,没有简单题了. 幸好,力扣上有各种大牛给写题解.看着他们行云流水的代码,真的是羡慕不已.让我印象最深刻的就是 ...

  8. 爬虫简介和requests模块

    目录 爬虫介绍 requests模块 requests模块 1.requests模块的基本使用 2.get 请求携带参数,调用params参数,其本质上还是调用urlencode 3.携带header ...

  9. Pyhton多线程

    在了解多线程前先给大家介绍下并发和并行: 并发:多个任务一起执行 在多任务之间快速切换处理 任务数量大于cpu核数  并行:一个cpu核处理一个任务,多个cpu核同时处理多个任务 任务数量等于或者小于 ...

  10. M - 诡异的楼梯 HDU - 1180(BFS + 在某个点等待一下 / 重复走该点)

    M - 诡异的楼梯 HDU - 1180 Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯 ...