java8——lambda表达式

怀瑾握瑜      2022-04-07     245

关键词:

本篇文章不介绍Lambda的前世今生,这里只对Lambda表达的应用做详细了解。以及与内部类的差异点。

Lambda表达式

Lambda表达式是Java SE 8版本中引入的新的语法糖。将功能看做方法参数,将代码看做数据。

Lambda表达式语法:

LambdaParameters -> LambdaBody

Lambda表达式分为三部分:

  • 参数列表
  • ->符号
  • 函数体

如:

() -> {} // 无参,返回结果为空
(x) -> System.out.println(x); // 带有一个参数
(Thread t) -> { t.start(); }  // 带有一个申明参数
(int x, int y) -> x + y; // 带有两个申明参数,一个方法参数;
(int x, int y) -> return x +y; // 带有两个申明参数,一个方法参数;
(x, y) -> return x +y; // 带有两个申明参数,一个方法参数;

总体上表现如上形式,是Java中一种新的风格的表达式,和普通的表达的确有很大风格上的差异性。

这种风格的语法优势:

  • 语法特点决定了语句的简洁紧凑,通过减少申明类型、return、单行语句去括号等等从而变得更精简;

  • 具有更强的表达能力,减少冗余的代码,从而更关注真正的功能语句,语义更精确清晰;

函数式接口

已经对lambda表达式定义好了,但是如何在兼容面向对象的Java体系中使用。在面向对象体系中,一切皆是对象,怎样将这种表达式作为对象去使用,从而引入函数使接口:只有一个抽象方法的接口,代表着单功能的契约

为了区分函数式接口和只包含一个抽象方法的普通接口,需要使用@FunctionalInterface注解标注接口,这样编译器就能将其作为函数式接口处理。

有了函数式接口就可以很方便的使用lambda表达式,使用Java来进行函数式编程。

Function<String, String> f = (String x) -> x.toUpperCase();
f.apply("msg");

lambda表达式可以赋值给函数式接口,这里涉及到目标类型上下文,编译器根据lambda表达式所在的上下文推导其目标类型为Function。

List<String> list = new ArrayList<>();
list.forEach((x) -> System.out.println(x));

lambda表达式作为方法参数,其实是list.forEach方法中的方法参数是函数式接口,编译器推导lambda表达式类型为forEach中的函数式接口类型作为lambda表达式的目标类型。

从以上可以看出:

  • lambda表达式的目标类型必须是函数式接口,但是函数式接口和lambda表达式是两部分,函数式接口并不属于lambda表达式一部分,只是作为其目标类型;

  • 函数式接口的抽象方法参数必须与lambda表达式的相一致:数量和个数;

  • 函数式接口抽象方法返回参数与lambda表达式返回值一致:类型;

  • lambda表达式中抛出的受检异常与函数式接口抽象方法上的throws保持一致;

函数式接口使得lambda表达式能够更好的使用。Java是面向对象,如果在此基础上引入lambda,势必需要向前兼容:

  • 如果引入新的类型,势必要与旧的api形成两套体系,这样就无法在历史版本中使用lambda表达式;

  • 如果引入新的类型,Java类库需要对于同一功能就需要维护两份:过去历史版本/lambda版本;

如果使用已有的接口表示:

  • 接口是 Java 类型系统的一部分

  • 接口天然就拥有其运行时表示(Runtime representation);

基于这些原因,选择已有的接口类型作为函数式接口,然后引入lambda表达式是最折中平衡的方式。

Lambda表达式与匿名内部类

  1. lambda表达式的简洁、紧凑的语法结构是匿名内部类所不能比拟的;

  2. lambda表达式具有更明确的语义——因为只关注有效的代码;

  3. lambda表达式的作用域比匿名内部类更加有友好(词法作用域/新的内部作用域):this在lambda表达式中表示外部内,而在内部类中表示当前内部类实例;变量名在lambda表达式中就是表示外部的,而在内部类中要防止继承自超类———lambda的词法作用域;(shadow问题)

  4. lambda是函数式编程的体现,内部类任然是在面向对象层面;

参考

深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

The Java? Language Specification

Lambda Expressions

java8新特性lambda表达式

一、Lambda表达式是什么?Lambda读音:拉姆达。Lambda是一个匿名函数,匿名函数就是一个没有名字的函数。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。Lambda表达式可以使代码变的更加简洁紧凑。语法lambda... 查看详情

java8lambda表达式

Java8Lambda表达式语法lambda表达式的语法格式如下:(parameters)->expression或(parameters)->{statements;}Lambda表达式实例publicclassCalculator{interfaceIntegerMath{intoperation(inta,intb);}publicintoperateBinary(inta,in 查看详情

java8中的lambda表达式

Lambda是什么Lambda表达式,也可称为闭包,是java8的新特性,作用是取代大部分内部类,优化java代码结构,让代码变得更加简洁紧凑。Lambda的基本语法 (expression)->expression或(expression)->{statements;} Lambda最重要特点用()->{}... 查看详情

java8——lambda表达式

...bda表达的应用做详细了解。以及与内部类的差异点。Lambda表达式Lambda表达式是JavaSE8版本中引入的新的语法糖。将功能看做方法参数,将代码看做数据。Lambda表达式语法:LambdaParameters->LambdaBodyLambda表达式分为三部分:参数列表-... 查看详情

java8新特性——lambda表达式

其实有规律,总结一下规律就行packagelambda;/*lambda表达式的使用1.举例:()->Integer.compare(o1,o2);2.格式:lambda形参列表(接口中的抽象方法形参列表)->lambda体(重写抽象方法的方法体)3.lambda表达式的使用总结:lambda左边的形参列表... 查看详情

java8lambda表达式示例

例1、用lambda表达式实现Runnable我开始使用Java8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。我们在这... 查看详情

java8新特性你知道java8为什么要引入lambda表达式吗?(代码片段)

...官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备。不过,如果是看文章的你出去面试,面试官问你这样的问题,你是否也能轻松回答呢?什么是Lambd... 查看详情

java8之lambda表达式详解(代码片段)

...文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解一.问题1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗?二.概... 查看详情

一文看懂java8的lambda表达式!

一文看懂Java8的Lambda表达式!IT领域的技术日新月异,Java14很快就要问世了,但是对于国内的许多程序员来说,连Java8都还没有真正掌握。今天,我们就来温习一下Java8的特性之一,Lambda表达式。Lambda表达式的前世--匿名类以往,... 查看详情

java8新特性:lambda表达式函数式接口以及方法引用(代码片段)

文章目录Java8新特性:Lambda表达式1.Lambda表达式概念2.Lambda表达式语法3.函数式接口(FunctionalInterface)4.Lambda表达式精简语法5.方法引用(MethodReference)5.1实例方法引用5.2静态方法引用5.3构造方法引用Java8新特性:Lambda表达式1.Lambd... 查看详情

java8新特性--lambda表达式

一、Lambda表达式是什么?Lambda表达式有两个特点一是匿名函数,二是可传递。匿名函数的应用场景是通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用Lambda表达式。lambda表达式所表示的匿名函数的内容应该是... 查看详情

java8lambda的使用

...定义匿名函数,而在java8中lambda是匿名内部类例1、用lambda表达式实现Runnable我开始使用Java8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java8之前的runnable实现方法,需要4行代码,... 查看详情

java8新特性-lambda

1.什么是lambda表达式(1)lambda表达式也被称为箭头函数,匿名函数,闭包。(2)lambda表达式体现的是轻量级函数式编程思想。(3)->符号式lambda表达式核心操作符号,符号左侧是操作函数,右侧是操作表达式。(4)jdk1.8新特性 2.ModelC... 查看详情

java8新特性-lambda表达式

...了java.util.funcion包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便与Lambda表达式对接。Collections中的常用函数接口Java集合框架的接口继承结构:   上图中蓝色标记和橙色标记的... 查看详情

java8新特性之一:lambda表达式

...具类、JVM等),其中最重要的升级是它给我们带来了Lambda表达式和StreamAPI。1、什么是Lambda表达式?  Lambda是一个匿名函数,可以理解为是一段可以传递的代码,可以将代码像传递参数、传递数据一样进行传输。使用Lambda表达... 查看详情

java8之lambda表达式看这一篇就够了

 java8增加了许多新特性,其中lambda表达式可以说为最重要的特性之一,本文将从如下几个方面来学习lambda:  1、lambda表达式的基本定义  2、lambda表达式的语法  3、lambda表达式基本示例 一、何为lambda表达式... 查看详情

java8特性详解lambda表达式stream(代码片段)

1.lambda表达式Java8最值得学习的特性就是Lambda表达式和StreamAPI,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正在将自己变的更高(Sha)级(Gua),更人性化。--------可以这么说lambda表达式其实就是... 查看详情

java8中的lambda表达式

Lambda表达式是Java8最受欢迎的功能。人们将函数式编程的概念引入了Java这门完全面向对象的命令式编程语言。关于函数式编程是如何运作的,这个话题超出了本文的范围,不过我们会提炼出它一个明显有别于我们所经常使用的OOP... 查看详情