【Java】lamda表达式

【Java】lamda表达式lamda表达式1.简介lamda表达式是java语言中函数式编程的一种形式。关于函数式编程,有一句话是这么介绍的,面向对象编程是对数据的抽象,而函数式编程是对行为的抽象。反映到函数的定义上,前者传参是一个对象,后者则是一个函数(对象)。lamda表达式承载了定义函数的方式。2.形式一种是直接定义,可以(a,b)->returna+b这种是直…

大家好,又见面了,我是你们的朋友全栈君。

lamda表达式

1. 简介

lamda表达式是java语言中函数式编程的一种形式。

关于函数式编程,有一句话是这么介绍的,面向对象编程是对数据的抽象,而函数式编程是对行为的抽象。

反映到函数的定义上,前者传参是一个对象,后者则是一个函数(对象)。lamda表达式承载了定义函数的方式。

 

2. 形式

一种是直接定义,可以

(a, b) -> return a+b

这种是直接在一句话里写写完,如果需要多条语句,可以这样,加入一个大括号里,里面定义多个表达式。

(a, b)-> {return a+b;}

如果没有返回值就不加return;

 

另外一种,比方说有一个地方已经定义好了满足需求的函数,我们想直接引用,可以:

obj::fun,或者className::fun

前者是非static的,后者是static的。当然,严格来讲,这种的其实不是定义lamda表达式了,是定义一个函数接口。

 

3. 引用值

需要注意的是,如果lamda引用了当前方法中的局部变量,这个变量必须是final的或者语义是final的,语义final指的是不能对那个变量再次赋值,否则会编译不通过。

换句话说,对于局部变量,lamda表达式引用的是一个值,而不是一个变量。

这里解释下为什么。

内部类的class文件是通过构造函数入参接收这个局部变量的,所以是值传递。

https://blog.csdn.net/u010900754/article/details/93137350

 

4. 函数式接口

java里面一切都是有类型的,lamda表达式也不例外。

lamda表达式的背后类型其实是函数接口。函数接口是特殊的接口类型,只包含了一个方法。lamda表达式的形式由背后的函数接口里方法的类型决定。

// 无参返回一个值
@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

// 内部消化一个值,没有返回值
@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}

// 输入一个值,输出结果
@FunctionalInterface
public interface Function<T, R> {

    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
}

// 类似function,只不过返回值是bool类型
@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
}

// 加强版function,两个输入
@FunctionalInterface
public interface BiFunction<T, U, R> {

    /**
     * Applies this function to the given arguments.
     *
     * @param t the first function argument
     * @param u the second function argument
     * @return the function result
     */
    R apply(T t, U u);
}

// 特殊版的bifunction,参数类型一样
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
..
}

以上是java8内部提供的一些函数接口定义,当然,我们可以自定义。

 

4. 类型推断

这个不是lamda表达式特定的内容,而是与泛型有关的。

我们定义泛型时,不需要时时刻刻都传入完整的泛型参数,编译器可以通过上下文语境来推断。

比如:

    public Integer tryParse(Function<String, Integer> function, String i) {
        return function.apply(i);   
    }

在定义lamda表达式时,是可以推断出类型的。

比如:tryParse((s)->Integer.parseInt(s), “999”);

编译器知道s是string,然后返回的是一个int。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137786.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 搭建Android开发环境(超详细)

    搭建Android开发环境(超详细)文章转自:http://www.cnblogs.com/xdp-gacl/p/4322165.html搭建最新版本的Android开发环境  最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是一直没有搭建开发环境去学习,Android的更新速度比较快了,Android1.0是2008年发布的,截止到目前为止And

    2022年7月23日
    3
  • anaconda与pycharm的关系、安装「建议收藏」

    anaconda与pycharm的关系、安装「建议收藏」一、anaconda和pycharm的关系anaconda和miniconda的介绍Anaconda:是一个打包的集合,它里面预装好了conda、某个版本的python、众多packages、科学计算工具等等,就是把很多常用的不常用的库都给你装好了,并且在安装一个库时会询问是否安装与该库相关联的库,它将库之间的关系理的非常清楚,为用户提供极大的便利。Miniconda,顾名思义,它只包含最基本的内容——python与conda,以及相关的必须依赖项,对于空间要求严格的用户,Miniconda是一种

    2022年8月25日
    4
  • Qt面试题整理

    Qt面试题整理1、Qt信号槽机制的优势(1)类型安全。需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数同接收该信号的槽的参数类型和参数个数相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须是信号参数的最后一个或几个参数。如果信号和槽的签名不符,编译器就会报错。(2)松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是哪个对象的哪个槽需要接收它发出的…

    2022年6月25日
    93
  • 【iOS】iOS之Button segue弹出popOver消除(dismiss)问题

    【iOS】iOS之Button segue弹出popOver消除(dismiss)问题

    2022年2月2日
    47
  • mhdd测试hdd硬盘软件,硬盘检测工具mhdd

    mhdd测试hdd硬盘软件,硬盘检测工具mhdd硬盘检测工具mhdd是一款能够修复坏道的专业硬盘检测工具,MHDD硬盘检测工具可以不依赖于主板BIOS直接访问IDE口,可以访问128G的超大容量硬盘,即使你用的是286电脑,无需BIOS支持,也无需任何中断支持。且MHDD还能够帮使用者修复坏轨,让使用者能够继续延续该硬盘的生命余光。软件功能:1、无论以CHS还是以LBA模式,都可以访问到128G的超大容量硬盘(可访问的扇区范围从512到3743…

    2022年7月12日
    17
  • Java内存模型(Memory Model)

    Java内存模型(Memory Model)

    2021年6月16日
    76

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号