• Java:lambda表达式



    本文内容:

    • lambda表达式的介绍
    • lambda表达式的语法
    • lambda表达式实现函数式接口
    • lambda表达式与Java自带的函数式接口的配合使用

    首发日期:2018-07-27


    lambda表达式的介绍

    • lambda表达式是java8新增的特性
    • lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(函数式接口)


    lambda表达式的语法:

    语法:

    • (形参列表) ->{代码块}image
      • 只有一条语句时,可以省去{}image
      • 形参为空时,要保留();一个参数时,可以没有括号
      • 当接口中定义了返回值时,表达式需要显示指定返回值;当只有一条语句时,会自动返回这条语句的值image
    • (形参列表) ->表达式    image
      • 由于使用表达式时,是默认返回表达式的值的,所以接口那里需要定义合适的返回值。比如右边的a+b,接口处不能定义成voidimage

    lambda表达式与函数式接口:

    lambda表达式的目标类型必须是函数式接口。lambda通常用来实现函数式接口。

    什么是函数式接口?

    1.是一个接口

    2.只有一个抽象函数

    3.可以有默认函数(如toString等默认函数,大部分是Object中的同名函数)【这里给一个为什么接口会有类似继承自Object的函数的原因:https://blog.csdn.net/xidiancoder/article/details/78011148

    image

    表达式的变量的作用域问题:

    • 如果你这样写image,你会发现他报错了,说明这里的并不是纯粹的局部变量,它是可以访问外部的。
    • 你这样写image,会发现是可以运行的。image
    • 在lambda中无法修改外部变量。
    • 在lambda中定义的变量,外部是无法使用的。


    lambda表达式实现函数式接口

    相信看过上面的内容,你已经了解函数式接口了。下面介绍如果利用lambda表达式实现函数式接口。

    image

    普通的实现方法有很多,可以创建一个实名类来实现接口,也可以利用匿名类来实现:

    1.创建一个实名类来实现接口

    image

    2.利用匿名类来实现

    image

    下面用lambda来实现,你会发现lambda确实能节省很多行代码。

    image

    image---lambda实现->image

    上面已经演示过:有参数的,没参数的,表达式的,代码块的。下面介绍另一个留心点。

    lambda表达式可以说是“任意类型”的,转换成什么取决于“需要什么”。

    如上面的,左边是一个接口,那么右边需要一个接口的实现类的对象,于是lambda会去实现这个接口的抽象函数,并创建一个对象返回。

    除此之外,还可以放在函数中作为形参,比如:

    image这个类的函数需要一个接口作为形参。当我们调用函数时,可以传入一个lambda表达式:

    image


    lambda表达式与Java自带的函数式接口的配合使用

    Java有不少自带的函数式接口,下面只以一个为例。

    Comparator是Java中用来排序的一个接口,里面有一个compare函数image
    很多能传入一个排序对象的函数,通常都是传入一个Comparator的实现类。

    比如Arrays中的排序函数就可以传入一个Comparator的实现类。image

    在不用lambda时,可以有:

    image

    使用lambda表达式之后:

    image

    如你所见,减少了很多代码。所以如果需要传入的对象是一个函数式接口时,不妨考虑使用lambd表达式,这会节省很多代码。


  • 相关阅读:
    winform窗体扁平化设置,窗体移动,关闭
    WPF按钮控件模板
    C#连接Sqlite报错:{"试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)"}
    C#SQLite使用教程笔记
    C#自定义控件导航菜单(自定义事件,属性)
    LCS局域网屏幕监控系统安装指导
    System.Data.SQLite.dll 未安装或者版本冲突,按下面步骤操作即可 1、从Nuget卸载所有项目的System.Data.SQLite.dll 和SqlSugar,检查引用中是否还存在,存在直接删掉引用,然后Nuget重新安装即可
    C#项目脱落NuGet
    JavaScript跨域总结与解决办法
    回流与重绘:CSS性能让JavaScript变慢?
  • 原文地址:https://www.cnblogs.com/progor/p/9377957.html
Copyright © 2020-2023  润新知