文档章节

Java Lambda表达式(一)

兴趣使然的程序员
 兴趣使然的程序员
发布于 2017/02/24 17:11
字数 867
阅读 63
收藏 3

Lambda表达式简介

Java 8新引入Lambda表达式。

注意Lambda表达式只能用来替代函数式接口(函数式接口是只包含有一个抽象方法的接口,哪怕有很多个默认方法,只有只有一个抽象方法,就是函数式接口)!甚至不能把Lamda表达式赋值给Object!即仍然保持使用接口的习惯,只是将接口的实现类编写简化成Lambda表达式。具体来说,Lambda表达式其实是函数式接口中的函数的实现

推荐给所有的函数式接口上加上@FunctionalInterface,表示这是一个函数式接口。

举例说明:

Comparator是一个接口,主要用于Arrays类的静态排序方法sort里指定排序的规则。

比如如果希望对字符串进行排序,排序规则为字符串的长度。如果不用Lambda表达式的话,我们一般会用一个匿名内部类来实现:

//创建Compartor接口的匿名实现
Comparator<String> comparator = new Comparator<String>() {
      @Override
      public int compare(String o1, String o2) {
           return Integer.compare(o1.length(),o2.length());
      }
};

//调用comparator对象进行排序
String[] words = new String[]{"l1111","l222"};
Arrays.sort(words,comp);

Lambda表达式的作用即在于替代上面的匿名实现部分,即:

//使用Lambda表达式写函数式接口实现
Comparator<String> comp = (first,second)->Integer.compare(first.length(),second.length());

固使用Lambda表达式有两个条件:

  1. 定义好的函数式接口
  2. 定义好的调用该函数式接口的方法

当然,由于Lambda表达式一般是“一次性用品”,所以一般我们会这样写:

Arrays.sort(words,(first,second)->Integer.compare(first.length(),second.length()));

由于隐去了接口对象的声明,同时隐去了变量类型的声明,所以有一些代码显得不明所以。

最后提示:

  1. 不需要声明参数的类型
  2. 不需要声明返回值的类型,在简单的情况下甚至不需要使用return。在比较复杂的情况下,可以像写方法一样写Lambda表达式,使用(x1,x2)->{    /*注意这里是花括号 */     };的形式写lambda表达式
  3. Lambda表达式可以没有限制地使用参数、实例变量和静态变量,但是如果想使用局部变量则必须显式地使用final修饰

Lambda表达式和闭包

闭包就是一个函数的实例,且它可以无限制地访问那个函数的非本地变量。例如,闭包可以作为参数传递给另一个函数。它也可以访问和修改其作用域之外的变量。

现在, Java 8的Lambda和匿名类可以做类似于闭包的事情:它们可以作为参数传递给方法,并且可以访问其作用域之外的变量。但有一个限制:它们不能修改定义Lambda的方法的局部变量的内容。这些变量必须是隐式最终的。可以认为Lambda是对值封闭,而不是对变量封闭。

这种限制存在的原因在于局部变量保存在栈上,并且隐式表示它们仅限于其所在线程。如果允许捕获可改变的局部变量,就会引发造成线程不安全的新的可能性,而这是我们不想看到的(实例变量可以,因为它们保存在堆中,而堆是在线程之间共享的) 。
 

© 著作权归作者所有

共有 人打赏支持
兴趣使然的程序员
粉丝 23
博文 112
码字总数 87412
作品 0
深圳
程序员
私信 提问
02、Java的lambda表达式和JavaScript的箭头函数

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

weir_will
2018/06/14
0
0
Lambda 表达式有何用处?如何使用?(针对Java8)

什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个“值”。 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的J...

亭子happy
2018/06/06
0
0
Java8学习:Lambda表达式与Functional接口

Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据:函数式程序员对...

王爵nice
2014/07/03
0
1
了解一下Java 8 (一)

2015年公司发展迅速,于是大量的时间花费在招聘上。招聘工程师,必然需要了解候选人的技术能力,尤其是对自己使用的技术的了解程度。优秀的工程师都需要知其然,也知其所以然,否则遇到技术难...

TalkingData
2016/01/20
1K
8
Java 8 Lambda限制:闭包

摘要:主要讨论一下java8 lambda的一些限制和闭包的概念,以及简单比较一下java和javascripe实现闭包的区别。 假设我们想创建一个简单的线程,只在控制台上打印一些东西: 如果我们想在线程里...

力谱宿云
2017/03/23
512
3

没有更多内容

加载失败,请刷新页面

加载更多

计算游戏权重代码

$list = [ [ 'pt' => 1, //权重序号 'pv' => 0, //权重值 ], [ 'pt' => 2, 'pv' => 10, ], [ 'pt' => 3, ......

我才是张先生
3分钟前
0
0
智能分单算法

算法描述 目前在物流,企业用工等领域,都有着大量的通过算法对接到的订单进行智能分配的需求。本文模拟的是用户下订单,然后商家接到订单,由配送人员进行派送的场景。在实际的应用中类似于...

鱼煎
5分钟前
0
0
即将开源 | 2亿用户背后的Flutter应用框架Fish Redux

背景 在闲鱼深度使用 Flutter 开发过程中,我们遇到了业务代码耦合严重,代码可维护性糟糕,如入泥泞。对于闲鱼这样的负责业务场景,我们需要一个统一的应用框架来摆脱当下的开发困境,而这也...

阿里云云栖社区
10分钟前
0
0
Ubuntu上搭建比特币运行环境

Ubuntu版本:16.04.3 Bitcoin Core版本:0.16 1. 比特币运行依赖的开源库 (1)必须依赖的库 库 目的 描述 libssl 加密 随机数生成,椭圆曲线加密算法 libboost 工具 线程库,数据结构等 li...

LoSingSang
15分钟前
1
0
IDE 插件新版本发布,开发效率 “biu” 起来了

近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明。 本地应用一键部署到任何...

zhaowei121
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部