一、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. Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系

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

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

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

  3. Lambda表达式和方法引用

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

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

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

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

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

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

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

  7. 廖雪峰Java16函数式编程-1Lambda表达式-3方法引用

    Java8引入了Lambda表达式,可以不必编写FunctionalInterface的实现类,直接写Lambda表达式.除了Lambda表达式,我们还可以直接传入方法引用 方法引用是指:如果某个方法 ...

  8. Java 8-lambda表达式及方法引用

    Lambda表达式 Lambda表达式是一个类似于匿名函数的语法糖,它实现一个函数式接口,它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理. 一个 Lambda 表达式可以有零个或多 ...

  9. java#lambda相关之方法引用

    lambda在java中通常是()->{}这样的方式,来书写的.通常的lambda是四大函数型接口的一个“实现”. 如果我们要写的lambda已经有现成的实现了,那么就可以把现成的实现拿过来使用 ...

随机推荐

  1. TypeError: unsupported operand type(s) for |: &#39;str&#39; and &#39;str&#39;

    问题描述:

  2. 实验三 java敏捷开发与XP

    一.实验内容 (一)敏捷开发与XP 软件开发流程的目的是为了提高软件开发.运营.维护的效率,并提高软件的质量.用户满意度.可靠性和软件的可维护性. 光有各种流程的思想是不够的,我们还要有一系列的工具来 ...

  3. 夺命雷公狗-----tp中遇到数据乘积的问题的遇见

    昨晚遇到了一个很神奇的问题, 然后打印出来的结果是 ) LIMIT , 然后dump出来的结果有点无语,他是10*10这样的倍增的,如果数据量大,分分钟直接可以让服务器直接死掉.... 想这问题我想了 ...

  4. iwpriv

    AuthMode             {OPEN,SHARED,WEPAUTO,WPAPSK,WPA2PSK,WPANONE} ::Set Authentication Mode EncrypTy ...

  5. android Service开机启动及debug

    开机启动一个service需要做的工作如下: 1.开发一个receiver用于接收系统广播: public class BootReceiver extends BroadcastReceiver { ...

  6. Apache log4net™ Config Examples

    Overview This document presents example configurations for the built-in appenders. These configurati ...

  7. 一步一步学android之布局管理器——RelativeLayout

    今天开始学习RelativeLayout(相对布局),相对布局在平时布局的时候用的较多,因为Android适配方面的原因.相对布局可以控制组件摆放的位置(放在任一组件的上下左右等位置),下面来看看类的 ...

  8. 3分钟教你做一个iphone手机浏览器

    3分钟教你做一个iphone手机浏览器 第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebV ...

  9. react学习笔记-01

    1. HTML模板 Jsx是react的语法糖,最终会被编译成js语法.因此需要第三方库browser将jsx转换成js. 由于react 0.14版本之后,将react和react-dom拆分,所以 ...

  10. Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)

    Problem   Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...