一、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. Linux进程相关命令使用场景

    Linux进程相关命令使用场景 在Linux系统上工作时,我们常常会碰到很多和进程相关的查询场景,今天在这里进行详细的讲解,进程相关的对象包括以下几个: 端口:Port 进程号:PId 执行文件所在路 ...

  2. hashmap相关面试题

  3. Python Redis list

    List操作,redis中的List在在内存中按照一个name对应一个List来存储. 注:列表存入 从右到左 如图: lpush(name,values) # 在name对应的list中添加元素,每 ...

  4. Python Redis 发布订阅

    发布者:服务器 订阅者:Dashboad和数据处理 频道主逻辑 import redis class RedisHelper: def __init__(self): # 链接服务端 self.__c ...

  5. 清华集训2017 Day 2简要题解

    *注意:这套题目题面请在loj / uoj查看 从这里开始 题目列表(loj) Problem A 小 Y 和地铁 Problem B 小 Y 和二叉树 Problem C 小 Y 和恐怖的奴隶主 训 ...

  6. UVA1203 Argus

    思路 用堆维护每个触发器的下一个事件,每次取出一个事件再把对应触发器的下一个事件加入堆即可 代码 #include <cstdio> #include <algorithm> ...

  7. 浅谈Final

    Java关键字final有“这是无法改变的”或者“终态的”含义,final可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的.fina ...

  8. Java 设置PDF文档背景——单色背景、图片背景

    一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括2种设置方法: 设置纯色背景色 设置图 ...

  9. word常用功能

    1. 安装office2013 cn_office_professional_plus_2013_x86_dvd_1134005 密钥激活 (1)用专用软件彻底卸载原来的 (2)安装 (3)用暴风激活 ...

  10. 最全面的移动APP测试点

    随着互联网,大数据时代的不断推进,演化.移动开发领域得到普遍普及,APP开发如潮水般涌现.下面我将详细介绍app的测试点: 首先我们先熟悉app测试基本流程: 1.1流程图 1.2测试周期 测试周期可 ...