02、Java的lambda表达式和JavaScript的箭头函数

前言

在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系;本次试图通过这篇文章弄懂上面的两个”语法糖”。

简介

Lambda 表达式来源于 C# 5.0,但又不太确定,于是查了下 百度百科:Lambda表达式,仍然没有得到明确的答案,所以懒得去纠结这个问题了。

箭头函数(arrow function),就是C#中的lambda表达式,据说Java8也把它加入了。但不管怎样,JS正在从其它语言吸纳优秀的特性(比如yield, class, 默认参数等等),且不论这些特性好坏,这件事本身就是极好的(至少我们正在使用的是一个充满活力的工具)

只是Java用 ->箭头,C#用的箭头与JS一样: =>,这个箭头叫”lambda运算符”,行话读作”goes to”

lambda表达式(箭头函数)据说是定义函数最简洁的方法,语法上几乎没有冗余成分了。因为JS弱类型的特点,JS中的lambda表达式要比C#和Java中的更简洁(少了参数类型声明)

一句话,箭头函数就是lambda表达式,提供了更简洁的function定义方式

lambda语法

什么是lambda?

这里先给简要的定义: 将匿名函数复制给变量的简写方式的函数称为 lambda 表达式

1、java的场景中:把”一块代码”赋给一个Java变量

02、Java的lambda表达式和JavaScript的箭头函数

这个是简化过程:

02、Java的lambda表达式和JavaScript的箭头函数

2、JS中同理也是比较简单的

var fun1 = funcation(int x,int y){
    return (x+y);
}

简写如下:

var fun1 = (x,y)=>x+y;

lambda的语法定义

这里由于 Java一切皆对象的原因,暂时先介绍JavaScript的定义,但Java基本雷同

JavaScript的箭头函数

Lambda 表达式的主要形式是如下定义,符号的左侧是参数,右侧是表达式或语句块。

(参数列表) => { 语句块 }

当”语句块”只有一条语句的时候,可以省略大括号,就成了

(参数列表) => 语句

注意: Lambda 表达式一般是作为参数或者值使用,所以根据使用的上下文,大部分情况下编译器可以推断出 Lambda 表达式的参数类型; Lambda 表达式的参数通常是省略类型的

Java的lambda表达式

Lambda 表达式的作用其实就是匿名方法,而 Java 中并没有匿名方法这一语法。不过 Java 中有匿名对象,当你直接 new 一个接口并实现接口方法的时候,Java 编译器实际是产生了一个类(匿名类)来实现这个接口,然后再返回这个类的一个实例,也就是匿名对象; Lambda表达式本身就是一个接口的实现

02、Java的lambda表达式和JavaScript的箭头函数

这种只有一个接口函数需要被实现的接口类型,我们叫它”函数式接口”。为了避免后来的人在这个接口中增加接口函数导致其有多个接口函数需要被实现,变成”非函数接口”,我们可以在这个上面加上一个声明@FunctionalInterface, 这样别人就无法在里面添加新的接口函数了:

02、Java的lambda表达式和JavaScript的箭头函数

下面是一个完整的案例:

@FunctionalInterface
public interface WorkerInterface {
    public void doSomeWork();
}

public class WorkerInterfaceTest {

    public static void execute(WorkerInterface worker) {
        worker.doSomeWork();
    }

    public static void main(String [] args) {

        //invoke doSomeWork using Annonymous class
        execute(new WorkerInterface() {
            @Override
            public void doSomeWork() {
                System.out.println("Worker invoked using Anonymous class");
            }
        });

        //invoke doSomeWork using Lambda expression
        execute( () -> System.out.println("Worker invoked using Lambda expression") );
    }

}

lambda的常见使用场景

上面通过两个简单的案例演示了lambda,现在总结一下在Java和JavaScript常见的用法和使用常见。

java中常见的使用场景

1. 何时用?

JAVA8中就提供了这种”函数式编程”的方法 —— lambda表达式,供我们来更加简明扼要的实现内部匿名类的功能。

函数式接口:Functional Interface.

定义的一个接口,接口里面必须 有且只有一个抽象方法 ,这样的接口就成为函数式接口。
在可以使用lambda表达式的地方,方法声明时必须包含一个函数式的接口。

简单的说,凡是(java8以上)函数式接口都可以尽量使用lambda表达式,注意:如果我们提供的这个接口包含一个以上的Abstract Method,那么使用lambda表达式则会报错。建议定义的接口加上 @FunctionalInterface注解。

2. 怎么用?

根据之前的思路;只要找到Java中函数式接口的皆可以放出 lambda表达式的大招。

  1. JDK 8之前已有的函数式接口

    java.lang.Runnable
    java.util.concurrent.Callable
    java.security.PrivilegedAction
    java.util.Comparator
    java.io.FileFilter
    java.nio.file.PathMatcher
    java.lang.reflect.InvocationHandler
    java.beans.PropertyChangeListener
    java.awt.event.ActionListener
    javax.swing.event.ChangeListener

  2. Java SE 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口:
    02、Java的lambda表达式和JavaScript的箭头函数

补充: 关于函数式接口的详细总结

1)Java8中Iterable的foreach(Comsumer action)的 函数式接口

02、Java的lambda表达式和JavaScript的箭头函数

2)Java8中Iteror的forEachRemaining(Comsumer action)的 函数式接口

02、Java的lambda表达式和JavaScript的箭头函数

3)Java8中函数式接口Predicate;Collections的removeIf(Predicate filter)

02、Java的lambda表达式和JavaScript的箭头函数

…其实还有很多,就不一一列举了,其实根据规则就很容易了加上编译器优化,其实写出lambda其实也是很容易。

JavaScript的箭头函数常用场景:

由于JavaScript基于函数编程,lambda表达式非常灵活常用,基本上对于参数的简单操作都可以使用箭头函数完成,这里可以告诉你不要试图滥用。

  • 箭头函数适合于无复杂逻辑或者无副作用的纯函数场景下,例如用在map、reduce、filter的回调函数定义中;
  • 不要在最外层定义箭头函数,因为在函数内部操作this会很容易污染全局作用域。最起码在箭头函数外部包一层普通函数,将this控制在可见的范围内;
  • 如开头所述,箭头函数最吸引人的地方是简洁。在有多层函数嵌套的情况下,箭头函数的简洁性并没有很大的提升,反而影响了函数的作用范围的识别度,这种情况不建议使用箭头函数。

参考资料

Original: https://www.cnblogs.com/weir110/p/9185151.html
Author: lee.weir
Title: 02、Java的lambda表达式和JavaScript的箭头函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607543/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • javax.xml.ws.Service 未定义未识别的错误

    可能缺失一个jar包. geronimo-jaxws_2.2_spec-1.1.jar.zip, 加入到编译指定的目录中。 http://www.java2s.com/Code/J…

    Java 2023年5月29日
    082
  • 数据索引

    索引的建立 create [unique唯一 | cluster 聚簇&#x7D22…

    Java 2023年6月9日
    064
  • javaweb实现下载

    实现代码 java代码 package com.kuang.servlet; ​ import javax.servlet.ServletException;…

    Java 2023年6月13日
    061
  • java使用freemarker作为模板导出Excel表格

    1:首先新建一个excel表格自己弄好格式如下图 2:把excel 表格另存为xml格式文件如下图 3:这个时候的文件就是xml 格式的文件了,在myeclipse里面项目工程里面…

    Java 2023年5月29日
    088
  • 阿里云ECS部署Redis主备哨兵集群遇到的问题

    一、部署 二、遇到的问题 1、bind公网IP地址时,会出现异常:【Cannot assign requested address】 原因:这里无法bind公网IP地址,是因为EC…

    Java 2023年6月5日
    058
  • springboot配置swagger2

    springboot+spring security配置swagger2 这里springboot整合springsecurity就不说了,上篇文章就有:https://www.c…

    Java 2023年6月5日
    081
  • 多线程(线程组【ThreadGroup】)

    线程组: 把多个线程组合到一起。* 它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。 生产者和消费者之等待唤醒机制的代码优化 线程实现类—设置和获取…

    Java 2023年6月5日
    073
  • 华为交换机如何配置SSH远程登录,一分钟秒学会

    从事网络运维工作的小伙伴们都知道,在交换机正式上线时,必须完成配置SSH远程登录,这样做目的是为了日后,维护方便,不需要每次登录设备都要跑到机房,这样既不现实,又费事。 远程登录方…

    Java 2023年6月8日
    064
  • MyBatis(二六):缓存——缓存原理

    首先来思考一下,在开启了二级缓存的情况下,一个用户查询数据经历的过程是什么样的。 我们看一下,下面这张图: 用户先去二级缓存中去寻找数据,如果找不到再去一级缓存寻找数据,如果还是找…

    Java 2023年6月15日
    083
  • 分享几个 Github 镜像网站(亲测可用)

    GitHub 在国内经常会出现无法访问的情况,下面分享几个 GitHub 镜像站供大家使用! GitHub镜像站: Original: https://www.cnblogs.co…

    Java 2023年6月6日
    0144
  • 微服务SpringCloud之GateWay服务化和过滤器

    Spring Cloud Gateway 提供了一种默认转发的能力,只要将 Spring Cloud Gateway 注册到服务中心,Spring Cloud Gateway 默认…

    Java 2023年5月30日
    073
  • 日常踩坑

    有人的地方就有江湖,有代码的地方就有坑 一。集合 List与Set继承自Collection。Collection提供定义了一个移除元素的接口 可以看出,在Collection中该…

    Java 2023年6月9日
    096
  • ELK多租户方案

    一、前言 日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的;ELK提供了一整套解决方案,并且都是开源软…

    Java 2023年6月6日
    0176
  • 再谈Mysql undo log, redo log与binlog

    一、undo log 1、undo log有两个作用 提供回滚和多个行版本控制(MVCC)。 在数据修改的时候,不仅记录了redo log,还记录了对应的undo,如果因为某些原因…

    Java 2023年6月5日
    069
  • Java 是否应该使用通配符导入( wildcard imports)

    这个问题应该是所有使用过 Java 第一课的人都会告诉你不要使用通配符导入。 主要问题 主要的问题是它使你的本地命名空间变得混乱。 用最简单的说法就是 Date 这个对象,你可能在…

    Java 2023年5月29日
    062
  • Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐作者:潘潘 若不是生活所迫,谁愿意背负一身才华。 ; 前言 上节我们介绍了 《 Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 》,内…

    Java 2023年6月13日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球