JAVA8之Lambda表达式与方法引用表达式
一、Lambda表达式
基本语法:
lambdaParameters->lambdaBody
lambdaParameters传递参数,lambdaBody用于编写逻辑,lambda表达式会生成一个函数式接口实现实例,因此可以将一个lambda表达式赋值给函数式接口引用。lambdaBody中的逻辑内容不会在定义时执行,在实际函数式接口调用时才会执行。
() - > {}//入参为空,返回为空
() -> 42//常量函数
(x) -> x+1
(int x) -> x+1
lambda表达式根据参数声明包含两个大类参数类型未声明,参数类型声明,不同于匿名内部类,lambda表达式的body共享上下文类的this变量,另一个注意点是lambda表达式的body部分可以使用外部变量,变量需要是final或者effectively final,
effectively final的定义如下:
如果是有初始值的变量,需满足:
1、没有声明为final
2、从未出现在赋值语句的左值部分
3、从未作为一个变量被++或者--之类的递增递减操作符操作过
如果是没有初始值的变量则需要满足
1、没有声明为final
2、在实际赋值前,绝对未赋值或者未绝对赋值
3、从未作为一个变量被C++或--之类的递增递减操作符操作过
通常方法,构造函数、lambda和异常的参数会被认为是effectively final
public class FunctionTest {
public void getFunctionName(){
int n = 10;
Consumer<Integer> func = (x) -> {
x = x+n;
n = 2;//编译前需要把本行代码注释掉,依据有初始变量需满足的条件2
System.out.println(x);
};
func.accept(13);
}
public static void main(String[] args){
FunctionTest test = new FunctionTest();
test.getFunctionName();
}
}
二、方法引用表达式
方法引用表达式是定义另一类函数式接口实现的方式,在JAVA8引入了函数式接口之后,可以把一个lambda表达式作为一个函数式接口实现实例赋值给一个函数式接口,另一种方式是直接使用方法引用,方法引用是使用方式:对象名::方法名,类、对象、数组、泛型引用方式均不同,下面是使用示例:
public class FunctionTest {
public static Integer staticMethod(int x){
System.out.println(x+10);
return x+10;
}
public static void main(String[] args){
//类的静态方法
Function<Integer,Integer> staticFunc = FunctionTest::staticMethod;
staticFunc.apply(20);
//对象方法
Function<String,String> instanceFunc = String::trim;
System.out.println(instanceFunc.apply(" abd c"));
Consumer<int[]> c1 = Arrays::sort;
int[] array = new int[]{1,3,45,4};
c1.accept(array);
Arrays.stream(array).forEach(x->System.out.print(x+","));
System.out.println();
Function<Integer,int[]> c2 = int[]::new;
int[] c2Array = c2.apply(10);
System.out.println(c2Array.length);
}
}
总结:
lambda表达式和方法引用表达式都可以赋值给函数式接口,证明他们也都指向一个函数或者方法,两者的使用场景显而易见,lambda表达式方便在行内快速声明一个方法并且指向一个函数,而方法引用表达式则是基于已有的方法。
JAVA8之Lambda表达式与方法引用表达式的更多相关文章
- java8的新特性之lambda表达式和方法引用
1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...
- Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系
1.Lambda表达式与接口之间的关系 只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口.见如下代码 Thread t1 = new Thread(new Runnable() ...
- java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现
问题解决思路:查看编译生成的字节码文件 目录 测试匿名内部类的实现 小结 测试lambda表达式 小结 测试方法引用 小结 三种实现方式的总结 对于lambda表达式,为什么java8要这样做? 理论 ...
- Lambda表达式和方法引用
1 , 为什么用lambda表达式 将重复固定的代码写法简单化 2 ,lambda表达式的实质 对函数式接口的实现(一个接口中只有一个抽象方法的接口被称为函数式接口) package com.mo ...
- 一文带你深入了解 Lambda 表达式和方法引用
前言 尽管目前很多公司已经使用 Java8 作为项目开发语言,但是仍然有一部分开发者只是将其设置到 pom 文件中,并未真正开始使用.而项目中如果有8新特性的写法,例如λ表达式.也只是 Idea Al ...
- Java 8 Lambda表达式之方法引用 ::双冒号操作符
双冒号运算符就是java中的方法引用,方法引用的格式是类名::方法名. 这里只是方法名,方法名的后面没有括号“()”.--------> 这样的式子并不代表一定会调用这个方法.这种式子一般是用作 ...
- Java提升二:Lambda表达式与方法引用
1.Lambda表达式 1.1.定义 lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式.它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达 ...
- lambda表达式之方法引用
/** * 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器.<br> * 与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码. ...
随机推荐
- Navicate 连接mysql问题
mysql8.0 and Navicate11.2 链接报错问题 亲测有效:记录一下仅供提醒自己 原创: https://blog.csdn.net/xdmfc/article/details/802 ...
- vue-i18n使用ES6语法以及空格换行问题
1.运行报错 报错使用了不恰当的exports Uncaught TypeError : Cannot assign to read only property 'exports ' of objec ...
- Kerberos 常用命令
最近项目组用CDH搭建数据开发环境,有用到Kerberos安全组件.如下是相关命令,请参考: 进入kadmin kadmin.local / kadmin 创建数据库 kdb5_util create ...
- 01:open-falcon入门篇
open-falcon其他篇 目录: 1.1 openfalcon介绍 1.2 open-falcon架构 1.1 openfalcon介绍返回顶部 openfalcon官网: https://b ...
- Webpack与其他打包工具的区别
webpack是一个模块化加载器兼打包工具,它同时支持AMD.CMD等加载规范.与其他模块化加载器相比,它有这些优势: 1.代码分割 webpack支持两种依赖加载:同步和异步.同步的依赖会在编译时直 ...
- Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified and no embedded datasource could be auto-configured.
从报错信息中,我们就可以分析出错误原因是触发了数据源的自动化配置,然而当前项目其实并不需要数据源.查其根源是依赖方提供的API依赖中引用了一些多余的依赖触发了该自动化配置的加载. 如何解决 为了解决上 ...
- 使用excel估计GARCH模型参数——以GARCH(1,1)为例
本文的知识点:使用excel求解GARCH模型的系数,以GARCH模型为例,主要采用的是极大似然估计法MLE. 同时给出了R语言的输出结果作为对照验证. 参考了:http://investex ...
- MVC扩展HttpHandler
扩展用来做防盗链 访问特殊后缀名的处理方式 localhost:8080/Home/index.aspx localhost:8080/Home/mao.jpg 比如 这样一个地址 ...
- JS模态框 简单案例
演示: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 【转】Angular学习总结--很详细的教程
*这篇文章是转来的,做了自己的一点修改,排版.原始出处不明,如涉及原博主版权问题,请及时告知,我将会立即删除*. 1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟 ...