欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入探讨Java 8 Lambda表达式及其在Android开发中的实践应用

时间:11-21 民间故事 提交错误

大家好,关于深入探讨Java 8 Lambda表达式及其在Android开发中的实践应用很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!

什么叫lambda呢?

Java 8 为我们带来了lambda。不过我在Oracle的文档中并没有找到lambda的定义,在维基百科中也没有找到适合Java中lambda的定义。在写这篇文章的时候,我看到这里有一篇很好的关于lambda的介绍。它给出了一个定义,我认为这个定义是非常恰当的。

lambda 表达式是带有参数的代码块。

lambda的写法

首先枚举一个完整的lambda表达式:

(整数a,整数b)-{

System.out.println("正在执行添加操作.");

返回a+b;

}lambda 表达式由三部分组成:

参数: (int a, int b) 是这个lambda表达式的参数部分,包括参数类型和参数名称。箭头: - 代码块:即用“{}”括起来的两行代码。上面是一个完整的lambda表达式。很多时候,很多事情是可以省略的。例如,当系统可以根据上下文自动推断参数类型时,可以忽略该参数类型。在这种情况下,它可以写成:

(一,二)-{

System.out.println("正在执行添加操作.");

返回a+b;

}系统如何自动推断参数类型?我们可以在下面看到它。

再比如,如果只有一个参数,并且可以自动判断参数的类型,那么连“()”都可以省略,所以可以写成:

一个-{

System.out.println("正在执行添加操作.");

返回a+a;

}再比如,如果代码块中只有一行代码,那么“{}”也可以省略,所以可以写为:

a-返回a+a;是的,可以写在同一行

a-返回a+a;让我们更进一步。在这里,“回归”其实是不必要的。

a -a+a;太好了,如果没有参数,是不是可以写成:

那么-a+a呢?

不幸的是,如果没有参数,则前面的“()”必须存在。也就是说,它必须写成:

()-a+a

lambda的用法

事实上,如果你将上面的代码直接放入你的编辑器中,你的IDE会报错,因为lambda不能这样使用。 lambda 的使用总是与称为函数式接口的东西绑定在一起。什么是函数式接口?函数式接口也是Java8中引入的一个概念,没错,是针对lambda的。我们知道java中的接口,Functional Interface是一种“只有一个抽象方法”的接口。例如,Runnable接口只有一个run方法,因此它是一个功能接口。

那么也许你要问,只有一个抽象方法的接口是什么?接口中的方法不是都是抽象的吗?嗯,Java8之前就是这样,在Java8中,Java引入了默认方法的概念,默认方法是有具体实现的方法:

公共接口DuckInterface {

公共无效walksLikeADuck();

公共默认void talkLikeADuck() {

System.out.println("嘎嘎!");

}

}在上面的示例中,talksLikeADuck 是默认方法。请注意,此方法的定义中有一个“默认”修饰符。相信很多人都会觉得这是一个非常有用的功能,我也这么认为。

我们来谈谈函数式接口和lambda。刚才提到,lambda必须与Functional Interface结合使用。那么如何搭配使用呢?

以Android中的View.OnClickListener为例(它也是一个函数式接口)如果没有lambda,我们经常这样使用它。

View.OnClickListener onClickListener=new View.OnClickListener() {

@覆盖

公共无效onClick(查看视图){

处理点击();

}

});

findViewById(R.id.someView).setOnClickListener(onClickListener);或者直接使用匿名内部类:

findViewById(R.id.someView).setOnClickListener(new View.OnClickListener() {

@覆盖

公共无效onClick(查看视图){

处理点击();

}

});上面5行代码中,唯一有用的就是handleClick(),但是我们要用5行代码来处理它,非常繁琐。在Java 8之前的世界里,有很多这样的代码。这种性质的代码有一个特殊的术语,称为“样板代码”。我不知道它的中文叫什么。

好的,现在使用lambda,我们可以这样写:

View.OnClickListener onClickListener=view -handleClick();

findViewById(R.id.someView).setOnClickListener(onClickListener);匿名内部类版本:

findViewById(R.id.someView).setOnClickListener(view -handleClick());是不是瞬间感觉简洁又优雅呢?

从上面的例子可以看出,lambda实际上相当于简化了Functional Interface实例的创建。当然,真正意义上的lambda 含义不止于此,但从使用的角度来看,你可以这样看。

从lambda到Functional Programming

让我们在这里讨论lambda 的一些其他特性。

在上面的例子中

View.OnClickListener onClickListener=view -handleClick();

findViewById(R.id.someView).setOnClickListener(onClickListener);这里,你可以将onClickListener视为OnClickListener的一个实例,也可以将其视为一个代码块。下面这句findViewById(R.id.someView ).setOnClickListener(onClickListener);相当于将此代码块传递给view.setOnClickListener() 函数。也就是说,从某种意义上说,您可以将lambda 视为可以相互传递的代码块。传递代码块是函数式编程(以下简称FP)的一个非常重要的特性,尽管两者实际上并没有等价关系。因为FP的本质特点是运行一段代码不会改变事物的状态,即没有副作用。在lambda中,可以调用所在类的成员方法,也可以访问和修改所在类的成员变量。

话说回来,我对FP了解不多。我自己没有太多FP 经验。虽然我对Ruby 有一定的了解,但Ruby 在FP 方面也只是“能够表现得比较好”,并不是纯粹的FP 语言。纯FP语言有List(包括Scheme、Clojure)、Haskell、ML等。关于FP,Robert Fowler(《Clean code》和《The Clean Coder》的作者)在这里有一个很棒的视频。

刚才提到,lambda代码块可以访问其所在类的成员变量和成员方法。局部变量呢?

我们知道,方法内定义的匿名类可以访问该方法的最终局部变量。 lambda作为Functional Interface的缩写,在这方面与匿名类是一致的。也就是说,lambda 可以访问定义它的方法的最终局部变量。在Java8中,lambda还可以访问所谓的“Effectively Final”局部变量。所谓“有效最终”局部变量是指那些除了在定义时被赋予初始值之外,其值不会改变的局部变量:

整数年龄=26; //这里,age是一个有效的最终局部变量

Runnable r=() -System.out.println("我的年龄是"+age);

新线程(r).start();

在Android开发中的应用

但是! Android只支持Java 7?该怎么办?别担心,相信网友的力量。已经有人开发了一个gradle插件,可以将Java 8中的labmda表达式转换为编译后的字节码中Java 7兼容的代码。点这里就可以在那个页面使用了,这里就不多说了。

关注公众号“小创作”,及时获取最新文章

用户评论

咆哮

终于弄明白了Lambda表达式,太赞了!

    有6位网友表示赞同!

情如薄纱

以前写代码老是需要回调函数,现在有了Lambda简洁多了。

    有17位网友表示赞同!

龙卷风卷走爱情

感觉Java 8之后写法都更灵动一些。

    有5位网友表示赞同!

命里缺他

学习一下Lambda,看看能不能提高Android开发效率。

    有13位网友表示赞同!

疲倦了

想问下使用Lambda表达式有什么需要注意的地方?

    有11位网友表示赞同!

爱到伤肺i

看这标题就知道又可以学到新东西了!

    有5位网友表示赞同!

幸好是你

希望这个文章能详细讲解Lambda在Android的应用场景。

    有7位网友表示赞同!

伪心

我已经开始尝试用Lambda写代码了,感觉还不错!

    有17位网友表示赞同!

炙年

我一直以为Android开发不太跟得上Java的最新更新,没想到现在还有这么酷的技术。

    有11位网友表示赞同!

孤岛晴空

学习一下这个技术以后是不是能找到更适合自己的开发方式呢?

    有14位网友表示赞同!

◆残留德花瓣

听起来很厉害的样子!

    有6位网友表示赞同!

素婉纤尘

之前没怎么接触过Lambda表达式,这篇文章正好让我来了解一下。

    有7位网友表示赞同!

龙吟凤

Android开发一直都是比较有意思的领域啊!

    有13位网友表示赞同!

满心狼藉

文章讲的这么详细,一定会让我对Lambda有更深入的理解。

    有5位网友表示赞同!

_心抽搐到严重畸形っ°

现在编程工具和技术变化那么快,一定要不断学习才能跟上时代步伐!

    有7位网友表示赞同!

温柔腔

我很期待看到这篇介绍Java 8 Lambda的文章,希望能学到不少东西!

    有16位网友表示赞同!

◆乱世梦红颜

这个Lambda表达式听起来很新奇,我一定要仔细研究一下它。

    有19位网友表示赞同!

風景綫つ

希望这篇文章能带给我一些新的开发思路。

    有8位网友表示赞同!

回到你身边

学习编程的路上总是充满了挑战和惊喜!

    有11位网友表示赞同!

揉乱头发

有了Lambda表达式以后,写代码可能就更加方便有趣了!

    有11位网友表示赞同!

【深入探讨Java 8 Lambda表达式及其在Android开发中的实践应用】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活