广告
返回顶部
首页 > 资讯 > 精选 >Java8和Scala中的Lambda表达式有什么不同
  • 158
分享到

Java8和Scala中的Lambda表达式有什么不同

2023-06-17 09:06:25 158人浏览 安东尼
摘要

本篇内容介绍了“Java8和Scala中的Lambda表达式有什么不同”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、为什么使用Lambd

本篇内容介绍了“Java8和Scala中的Lambda表达式有什么不同”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、为什么使用Lambda表达式

Lambda表达式通常使用在图形用户界面(GUI)的开发中。一般来说,GUI编程将程序行为和事件做连接。比如,当用户按下一个按钮(触发一个事件),你的程序就需要去执行某些行为,可能是将一些数据储存到一个数据存储器中。在Swing中,可以使用ActionListener来实现:

class ButtonHandler implements ActionListener {      public void actionPerfORMed(ActionEvent e) {          //do something      }  }   class UIBuilder {      public UIBuilder() {          button.addActionListener(new ButtonHandler());      }  }

这个例子表明了 ButtonHandler 类作为一个回调替换的用法。在这里 ButtonHandler 类仅包含 ActionListener 接口定义的 actionPerformed 方法。我们可以使用匿名内部类来简化代码:

class UIBuilder {      public UIBuilder() {          button.addActionListener(new ActionListener() {              public void actionPerformed(ActionEvent event) {                  //do something              }          })      }  }

这样代码简洁多了。更仔细的去看代码时,就会发现我们还创建一个只生成一个实例的类,而这个实例也仅仅持有一个独立的方法。这恰好是Lambda表达式所能解决的其中一类问题。

2、Lambda表达式代替函数

一个lambda表达式从字面上讲就是一个函数。它定义了一个函数的输入参数和函数体。Java 8 中的,lambda表达式语法尚未确定,不过大致应该类似这个样子的:

(type parameter) -> function_body

一个具体的例子:

(String s1, String s2) -> s1.length() - s2.length();

这个lambda表达式用来计算两个字符串的长度差。还有一些扩展的语法,比如避免参数的类型定义(我们马上见看到例子)还有使用{和}来支持多行定义。

Collections.sort() 方法是lambda表达的理想例子。它允许我们将字符串按照长度排序

List<String> list = Array.asList("loooooong", "short", "tiny");  Collections.sort(list, (String s1, String s2) -> s1.length() - s2.length());  > "tiny", "short", "loooooong".

所以,不像现在java必须要求的向sort方法输入一个已经实现的Comparator(比较器)而是传送一个lambda表达式我们就可以得到相同的结果。

3、Lambda表达式代替闭包

lambda表达式有许多有趣的特性。其中之一是,它们是闭包。一个闭包允许函数访问直接词法作用域之外的变量。

String outer = "java 8" (String s1) -> s1.length() - outer.length()

在例子中,lambda表达式访问了字符串 outer 这个作用域之外定义的变量。对于内联闭包来说这是很难做到的。

4、Lambda表达式也支持类型推论

类型推论是java 7 引入的但它同样适用于lambda表达式。简单来说,类型推论意味着程序员可以在任意一个编译器能够自动推断出类型的地方省略类型定义。如果类型推论能够应用到前面的排序lambda表达式上,那么它就能写成下面的样子:

List<String> list = Arrays.asList(...);  Collections.sort(list, (s1, s2) -> s1.length()-s2.length());

就像你所见到的一样,参数s1和s2的类型被省略了。因为编译器知道list是一个字符串集合,它知道被用来作为比较器的lambda表达式必定是相同的类型。因此,这个类型不需要显式地声明,即使你有这么做的自由。

类型推论的主要优势就是减少样板代码,如果编译器可以为我们识别类型,为什么我们必须自己定义它们。

5、珍爱Lambda表达式,远离匿名内部类

我们来体会下,为何lambda表达式和类型推论有助于简化我们前面所提到的回调例子:

class UIBuilder {      public UIBuilder() {          button.addActionListener(e -> //process ActionEvent e)      }  }

我们下载直接传送一个lambda表达式进入 addActionListener 方法来代替前面定义的持有回调方法的类。除了减少模板代码和提高可读性以外,它使我们直接表达我们***感兴趣的事情:处理事件。

在我们了解lambda表达式更多优势之前,先来看看在Scala中的lambda表达式副本。

6、Scala中的Lambda表达式

在函数式编程中,函数是基本的构造块。Scala融合了java中的面向对象编程和函数式编程。在Scala中,一个lambda表达式是种叫做“函数”或者“函数文本”。Scala中的函数属于一等公民。它们可以被分配给vals或者vars(最终变量或者非最终变量),它们可以作为其他函数的参数,也可以组合成新的函数。

在Scala中一个函数文本写成如下形式:

(argument) => //funtion body

举例来说,前面提到的java 用来计算两个字符串长度差的 lambda 表达式,在Scala中写作如下:

(s1: String, s2 :String) => s1.length - s2.length

Scala中的函数文本也是闭包。它可以访问在直接词法作用域之外定义的变量。

val outer =10 val myFuncLiteral = (y: Int) => y * outer  val result = myFuncLiteral(2)  > 20

这个例子结果是20.

正如你所见,我们将函数文本分配给了变量 myFuncLiteral。

java 8 的lambda表达式和Scala的函数文本在语法和语义上的相似性是十分明显的。从语义上讲它们是相同的,而语法上的***不同就是箭头符号(java8 ->, scala =>)和我们没有提到的简化符号。

“Java8和Scala中的Lambda表达式有什么不同”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java8和Scala中的Lambda表达式有什么不同

本文链接: https://www.lsjlt.com/news/288186.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java8和Scala中的Lambda表达式有什么不同
    本篇内容介绍了“Java8和Scala中的Lambda表达式有什么不同”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、为什么使用Lambd...
    99+
    2023-06-17
  • java8中lambda表达式的语法是什么
    这篇文章主要介绍“java8中lambda表达式的语法是什么”,在日常操作中,相信很多人在java8中lambda表达式的语法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java8中lambda表达式...
    99+
    2023-07-02
  • lambda表达式在Java8中的作用有哪些
    本篇文章给大家分享的是有关lambda表达式在Java8中的作用有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.关于JSR335JSR是Java Specificati...
    99+
    2023-05-31
    java8 lambda
  • java8新特性lambda表达式的语法是什么
    这篇“java8新特性lambda表达式的语法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java8新特性lambd...
    99+
    2023-07-05
  • 详解Java8中的lambda表达式、::符号和Optional类
    目录Java8中的lambda表达式、::符号和Optional类 0. 函数式编程1. lambda表达式2. 双冒号::符号3. Optional类Java8中的lam...
    99+
    2022-11-12
  • Java中Lambda表达式有什么用
    小编给大家分享一下Java中Lambda表达式有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Lambda表达式:1、简介首先Lambda表达式是属于Jav...
    99+
    2023-06-29
  • Java中的Lambda表达式是什么
    这篇文章主要介绍“Java中的Lambda表达式是什么”,在日常操作中,相信很多人在Java中的Lambda表达式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的Lambda表达式是什么”的疑...
    99+
    2023-06-25
  • ABAP正则表达式与SPLIT INTO有什么不同
    这篇文章主要介绍“ABAP正则表达式与SPLIT INTO有什么不同”,在日常操作中,相信很多人在ABAP正则表达式与SPLIT INTO有什么不同问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ABAP正则表...
    99+
    2023-06-04
  • Scala读取文件和正则表达式的方法是什么
    这篇文章主要介绍“Scala读取文件和正则表达式的方法是什么”,在日常操作中,相信很多人在Scala读取文件和正则表达式的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Scala读取文件和正则表达式...
    99+
    2023-06-02
  • JS中函数表达式和函数声明的不同点是什么
    本篇内容介绍了“JS中函数表达式和函数声明的不同点是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1....
    99+
    2022-10-19
  • C++11中的可变参数模板和lambda表达式怎么使用
    本篇内容介绍了“C++11中的可变参数模板和lambda表达式怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.可变参数模板C++1...
    99+
    2023-07-05
  • java中懒汉和饿汉模式有什么不同
    这期内容当中小编将会给大家带来有关java中懒汉和饿汉模式有什么不同,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2...
    99+
    2023-06-14
  • PHP中的include和require有什么不同
    这篇文章主要讲解了“PHP中的include和require有什么不同”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的include和require有什么不同”吧!在PHP中,有两种...
    99+
    2023-06-20
  • python中的return和yield有什么不同
    这篇文章主要介绍“python中的return和yield有什么不同”,在日常操作中,相信很多人在python中的return和yield有什么不同问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中...
    99+
    2023-06-20
  • Form表单中post与get数据传输方式有什么不同
    本篇内容介绍了“Form表单中post与get数据传输方式有什么不同”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2022-10-19
  • 在SQL中删除表数据和删除表结构有什么不同
    这篇文章主要介绍了在SQL中删除表数据和删除表结构有什么不同,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在SQL中删除表数据和删除表结构的...
    99+
    2022-10-18
  • Python 接口和 Laravel 的 path 处理方式有什么不同?
    Python 和 Laravel 都是非常流行的编程语言和框架,它们在处理 path 方面有许多不同的方法。在本文中,我们将比较 Python 接口和 Laravel 的 path 处理方式,并讨论它们之间的差异。 Python 接口的 ...
    99+
    2023-09-06
    接口 laravel path
  • ASP和Django在分布式开发技术中有什么不同?
    随着互联网的发展,分布式系统已经成为了一种趋势,这使得分布式开发技术越来越受到人们的关注。ASP和Django是两种常用的分布式开发技术,它们在分布式开发中有着很大的应用。本文将介绍ASP和Django在分布式开发技术中的不同之处。 A...
    99+
    2023-06-19
    django 分布式 开发技术
  • PHP和Bash编程中的算法有什么不同?
    算法是计算机编程中不可或缺的重要组成部分。无论是PHP还是Bash编程,算法都是实现各种功能的关键。然而,PHP和Bash编程中的算法存在一些不同。在本文中,我们将探讨这些不同之处,并通过演示代码来进一步说明。 编程语言的不同 PHP...
    99+
    2023-06-26
    并发 bash 编程算法
  • Python中的Numpy和Django的文件处理有什么不同?
    Python是一种非常流行的编程语言,它可以帮助我们处理各种各样的数据和文件。Numpy和Django是Python中非常常用的两个库,它们都有着非常强大的文件处理功能。但是,它们之间有什么不同呢?本文将会对这个问题进行详细的分析。 首先,...
    99+
    2023-06-01
    numpy django 文件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作