知识精解java8中的lambda表达式

在咖啡里溺水的鱼 在咖啡里溺水的鱼     2022-11-11     525

关键词:

知识精解系列将以博主的第一视角对各类技术中的核心要点进行深入的解析,不会覆盖相关技术的全部内容,适合想要快速了解相关技术核心内容的人群阅读。

本文为 《Java8函数式编程》(Java 8 Lambdas: Functional Programming for the Masses) 第二章内容的精解,若对相关知识感兴趣,想要全面的学习相关知识,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。
本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。
开源创造世界

有关Lambda表达式,写在前面

为了学习Java8Lambda表达式的相关内容,我也在网上翻阅许久,发现了一个共通的问题在于:有关Lambda表达式,大家都在强调它是原来版本的Java中匿名方法的一种替代。有过Java知识系统学习的读者的确知道什么是匿名方法,但是大部分的开发者在日常开发中并不经常使用。而且作为一种曾经Lambda表达式的替代方法,匿名方法的存在本身就是一个比较抽象且难以理解的东西。所以我并不赞同各位把Lambda表达式与以前的匿名方法扯上关系,尝试使用匿名方法的思想去理解Lambda表达式究竟是什么,我们只需要知道他是一个没有名字的方法就可以,不需要与过去的写法做类比。在我学习相关知识的时候就是把有关匿名方法与Lambda表达式的联系完全抛开之后,才恍然大悟的。当然这也可能因为我比较笨吧。

在我看来,我们可以把Lambda表达式做一个更容易理解的描述(注意是描述,而不是定义):
- Lambda表达式是没有名字的方法
- Lambda表达式可以当作方法的参数和返回值

我们完全可以把Lambda表达式整体当作一个Java中的实体来看待,就像一个变量、一个引用一样。

lambda表达式的几种写法

以下写法中,等号右边的内容就是Lambda表达式。

1.不包含参数,使用空括号代表没有参数。

Runnable noArguments = () -> System.out.println("Hello World");

2.只包含一个参数,可以省略参数的括号。

ActionListener oneArgument = event -> System.out.println("button clicked");

3.lambda表达式的主体是一个代码块

Runnable multiStatement = () - > 
    System.out.println("Hello");
    System.out.println("World");
;

4.包含多个参数

BinaryOperator<Long> add = (x,y) -> x + y;

5.显式声明参数类型

BinaryOperator<Long> addExplicit = (Long x,Long y) -> x + y;

可以看出,Lambda表达式和普通的方法在功能上别无二致。可以有0或多个入参,可以有0或1个返回值。可以输出内容,可以执行计算,等等。区别在于,它有一些简便的写法,包括去掉一些不必要的符号,去掉一些可以确定的类型限定符号。

目标类型:lambda 表达式所在上下文环境的类型。

Lambda 表达式的类型依赖于上下文环境,是编译器推断出来的。

小结:lambda 表达式中,-> 符号前面的内容对应于传统方法中的参数列表,后面的内容对应于方法体。而参数类型和返回值类型是编译器推断出来的。

引用值,而不是变量

在匿名内部类中,只能使用所在方法内的final变量。Java 8 放宽了这一限制,可以引用非final变量,但是该变量在既成事实上必须是final,Lambda表达式中的规则与之相同。

既成事实上的final(Effctively Final)是指只能给该变量赋值一次,也就是说,Lambda表达式引用的是值,而不是变量。 ——这是一个十分重要的概念,希望读者能够在此留心,深入理解一下,确保明白了其中真正的含义。

Lambda表达式的这种表现,也是其称之为闭包的原因。未赋值变量与周边环境隔离起来,进而被绑定到一个特定的值。

小结:lambda表达式又称之为闭包,表达式内只能引用 既成事实上的final变量。

函数接口

函数接口是只有一个抽象方法的接口,用作Lambda表达式的类型

Java中重要的函数接口

接口参数返回类型用途
PredicateTboolean断言
ConsumerTvoid消费
FunctionTR转换
SupplierNoneT生产
UnaryOperatorTT一员运算
BinaryOperator(T,T)T多员运算

小结:函数接口是只有一个抽象方法的接口,用作lambda表达式的类型。JDK 8 中提供了几种常用的函数接口。这几种接口在Java8的其他特性尤其是Stream API中将会经常被提到,请多看几遍,已经记住了这几种函数接口的作用。

类型推断

Lambda表达式中的类型推断,源自于Java 7 中已经引入的目标类型推断的扩展,Java7中的目标类型推断体现在菱形运算符上。

类型推断,程序依然要经过类型检查来保证运行的安全性,但不用再显式声明类型。

章节要点

  • Lambda表达式是一个匿名方法,将行为像数据一样传递
  • Lambda表达式的常见结构:BinaryOperator add = (x, y) -> x + y
  • 函数接口指仅具有单个抽象方法的接口,用来表示Lambda表达式的类型。

Lambda表达式应该怎么使用,使用Lambda表达式能给我们带来怎么样的好处?我觉得大部分人解释的并不是很清楚,Lambda表达式自身的出现除了使代码变得简洁一些以外,似乎并不能给我们带来什么。其实不然,Lambda表达式的强大之处在于它和其他类库之间的配合,以及它解锁了一种新的编程思想,这背后的价值是无穷的。

在之后的Stream API相关的内容中,你会真切的体会到Lambda表达式的强大,令人惊叹。

java8新特性_lambda表达式

最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看《写给大忙人看的JavaSE8》.这里我会结合书中的知识以及网上的... 查看详情

java8中的lambda表达式

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

java8中的lambda表达式

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

java8知识总结_1.lambda表达式(代码片段)

1.Lambda表达式1-1.概述Lambda 允许我们将函数当成参数传递给某个方法。关于Lambda表达式的“好处”或是“优点”,很多技术相关网站上的文章或书籍都有提到:”使用Lambda表达式可以使代码变的更加简洁紧凑。&... 查看详情

java8新特性——lambda表达式

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

java8-lambda表达式

...。函数式接口很有用,因为抽象方法的签名可以描述Lambda表达式的签名。函数式接口的抽象方法的签名称为函数描述符。所以为了应用不同的Lambda表达式,你需要一套能够描述常见函数描述符的函数式接口。JavaAPI中已经有了几... 查看详情

javalamda和predicate用法例子

参考1.JAVA8之lambda表达式详解,及stream中的lambda使用2.深入浅出Java8Lambda表达式3.JAVA8之lambda表达式详解,及stream中的lambda使用4.predicatejava_java8中predicate的用法介绍5.Java8Predicate花样用法6.java8中predicate的使用方法7.Java8新特性 查看详情

javalamda和predicate用法例子

参考1.JAVA8之lambda表达式详解,及stream中的lambda使用2.深入浅出Java8Lambda表达式3.JAVA8之lambda表达式详解,及stream中的lambda使用4.predicatejava_java8中predicate的用法介绍5.Java8Predicate花样用法6.java8中predicate的使用方法7.Java8新特性 查看详情

java8和scala中的lambda表达式

参考技术A   Java终于要支持Lambda表达式!自年以来Lambda表达式已经在Lambda项目中被支持在那时候Lambda表达式仍被称为Java闭包在我们进入一些代码示例以前先来解释下为什么Lambda表达式在Java程序员中广受欢迎  &n... 查看详情

java8新特性-lambda表达式

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

为啥要使用lambda表达式?原来如此,涨知识了

...化,推出了一系列函数式编程风格的语法特性,比如Lambda表达式以及Stream。如果采用Lambda表达式,上面三段代码的实现将会变得极为简洁。创建线程并启动(采用Lambda版本)比较数组(采用Lambda版本)给按钮添加单击事件(采用Lambda版... 查看详情

java8新特性之lambda表达式

简介Java8带来的新特性之一Lambda表达式,又称之为函数式编程,核心思想是将面向对象中的传递对象变为传递行为语法expression=(variable)->anctioneg:intsum=(x,y)->x+y;variable:相当于一个变量,可以有多个action:代码逻辑部分,可以是一... 查看详情

java8特性详解lambda表达式:流式处理中的lambda(代码片段)

...#xff0c;其中的「函数」就是方法引用,「式」就是Lambda表达式。Lambda表达式Lambda表达式是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象,是一个匿名函数,即没有函数名的函... 查看详情

java8函数式编程(代码片段)

Lambda表达式函数式接口方法引用与构造器引用StreamAPI接口中的默认方法与静态方法新时间日期API其他新特性速度更快代码更少(增加了新的语法Lambda表达式)强大的StreamAPI便于并行最大化减少空指针异常Optional其中最为核... 查看详情

java8函数式编程数据流和lambda表达式

JDK1.8中引入了函数式编程(functionalprogramming,FP),如果您已习惯OOP,一定会感到困惑:什么是函数式编程?这样的编程模式有什么好处?本文将通过简单的实例令读者对函数式编程有一个大体的了解。我们知道OOP是以类为基础的... 查看详情

重点知识学习--[java8之stream流]

...集合,可看作是遍历数据集的高级迭代器;stream与lambda表达式结合后编码效率大大提高,且可读性更强。Stream擅长于对数据的操作.例如这个案例这里先定义一个Person类;/***@authorb 查看详情

java8lambda表达式中的异常处理(代码片段)

1概述在Java8中,当写lambda表达式并处理异常时代码变得冗余不堪,本文主要介绍lambda表达式中一些异常处理方式。2处理Unchecked异常下面的代码,当i为0时会引发ArithmeticException异常。List<Integer>integers=Arrays.asList(3... 查看详情

java8lambda表达式中的异常处理(代码片段)

1概述在Java8中,当写lambda表达式并处理异常时代码变得冗余不堪,本文主要介绍lambda表达式中一些异常处理方式。2处理Unchecked异常下面的代码,当i为0时会引发ArithmeticException异常。List<Integer>integers=Arrays.asList(3... 查看详情