一、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表达式与方法引用表达式的更多相关文章

  1. java8的新特性之lambda表达式和方法引用

    1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...

  2. Java函数式编程:一、函数式接口,lambda表达式和方法引用

    Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...

  3. Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系

    1.Lambda表达式与接口之间的关系 只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口.见如下代码 Thread t1 = new Thread(new Runnable() ...

  4. java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现

    问题解决思路:查看编译生成的字节码文件 目录 测试匿名内部类的实现 小结 测试lambda表达式 小结 测试方法引用 小结 三种实现方式的总结 对于lambda表达式,为什么java8要这样做? 理论 ...

  5. Lambda表达式和方法引用

    1 , 为什么用lambda表达式 将重复固定的代码写法简单化 2   ,lambda表达式的实质 对函数式接口的实现(一个接口中只有一个抽象方法的接口被称为函数式接口) package com.mo ...

  6. 一文带你深入了解 Lambda 表达式和方法引用

    前言 尽管目前很多公司已经使用 Java8 作为项目开发语言,但是仍然有一部分开发者只是将其设置到 pom 文件中,并未真正开始使用.而项目中如果有8新特性的写法,例如λ表达式.也只是 Idea Al ...

  7. Java 8 Lambda表达式之方法引用 ::双冒号操作符

    双冒号运算符就是java中的方法引用,方法引用的格式是类名::方法名. 这里只是方法名,方法名的后面没有括号“()”.--------> 这样的式子并不代表一定会调用这个方法.这种式子一般是用作 ...

  8. Java提升二:Lambda表达式与方法引用

    1.Lambda表达式 1.1.定义 lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式.它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达 ...

  9. lambda表达式之方法引用

    /** * 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器.<br> * 与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码. ...

随机推荐

  1. bzoj1911 [Apio2010]特别行动队commando

    题目链接 斜率优化 #include<cstdio> #include<cstdlib> #include<string> #include<cstring& ...

  2. vue-i18n安装配置,运行

    需求:根据浏览器语言自动切换语言 1.安装vue-i18n, yarn安装 $ yarn add vue-i18n npm安装 $ npm install vue-i18n 2.导入语言包 src下创 ...

  3. Shell 脚本进阶2

    1.查询系统基础情况脚本 #!/bin/bash # 系统状态查询脚本 # 输出系统基本信息 # # 系统版本 SYSTEM_VERSION=`cat /etc/redhat-release` # 主 ...

  4. java限制map大小,并FIFO淘汰

    有时候需要往一个MAP中写入一些记录,但又怕无限制地写入会导致内存爆掉,所以得限制这个MAP的大小. 实现:LinkedHashMap提供了简单的方法. 首先,定义一个最大数,比如1000,然后new ...

  5. java excel大数据量导入导出与优化

    package com.hundsun.ta.utils; import java.io.File; import java.io.FileOutputStream; import java.io.I ...

  6. zabbix/自动发现规则

      对于zabbix 我们并不陌生 他是开源的监控系统,现在的一部分企业都在用zabbix,今天给大家分享的是企业级监控zabbix的自动发现规则,有了它我们自定义健康的时候根据宏值可以让他自动发现对 ...

  7. Memcache_分布式缓存

    一. Memcache简介 1. 什么要用到Memcache以及该能解决什么问题 高并发访问数据库的痛楚:死锁! 磁盘IO之痛 多客户端共同缓存 NET+Memory>>IO 读写性能完美 ...

  8. zookeeper及kafka集群搭建

    zookeeper及kafka集群搭建 1.有关zookeeper的介绍可参考:http://www.cnblogs.com/wuxl360/p/5817471.html 2.zookeeper安装 ...

  9. [JSTL - fmt] fmt标签格式化日期

    <span ><fmt:formatDate value="${ann.adate }" pattern="yyyy-MM-dd"/>& ...

  10. Luffy之注册认证(容联云通讯短信验证)

    用户的注册认证 前端显示注册页面并调整首页头部和登陆页面的注册按钮的链接. 注册页面Register,主要是通过登录页面进行改成而成. 先构造前端页面 <template> <div ...