Lambdas:来到您附近的Java 8!

什么是Lambda?

Lambda表达式是一种匿名函数,可以在方法中内联编写,并且可以在使用表达式的任何地方使用。 有时您可能会发现它们被称为闭包,尽管我在下面解释了对该参考的一些注意事项。 像普通的Java方法一样,它具有参数和可以执行的主体。 lambda表达式是Java 8中令人兴奋的新功能之一,它已定义为JSR 335的一部分。

添加lambda表达式将使Java更轻松地支持函数式编程技术和高阶函数。 这并不是说突然变成一夜之间成为一种异乎寻常而深奥的语言(例如Haskell),但是它将朝着与C#,Ruby或python之类的语言相同的方向发展。 也就是说,为有意义的功能样式提供部分支持,但仍然允许您使用命令式技术,例如可变变量。

基本语法

这是一个lambda表达式,它使数字增加1:

x -> x + 1

如您所见,表达式以参数开头,以参数主体结尾,并用箭头将两者分开。 您也可以显式键入参数,在类型注释上放置类型注释或具有多个参数。 如果您想执行这些操作,则需要将参数放在方括号中,例如:

// Explicit Types(Integer x) -> x + 1// Multiple Arguments(Integer x1, Integer x2) -> x1 + 1// Annotations:(Integer x1, @SuppressWarnings("unused") Integer x2) -> x1 + 1

到目前为止,所有的lambda主体都是表达式,但是您也可以像常规方法一样,将主体编写为一系列语句。

(x) -> { x += 5; System.out.println(x); return x; 
};

由于lambda是正则表达式,因此您可以将其视为正则表达式。 例如,您可以将它们分配给变量,将它们作为参数传递给其他方法。

// a method: 
public static void useFunc(IntFun f) { System.out.println(f.apply(2)); 
} // in code 
IntFun inc = x -> x + 1; 
useFunc(inc); 
useFunc(x -> x + 1);

类型?

由于这是Java,因此即使不是所有这些“ x”参数都标记为“整数”,所有这些函数仍然是静态类型的。 幸运的是,Java 7中方法句柄的引入提供了一种引用方法本身的方法。 这意味着您的函数并不需要全部实现某个通用接口,它们可以是被认为是“函数接口”的任何东西。

引用规范草案,“功能接口是仅具有一种抽象方法的接口,因此表示单个功能协定。” 这些也可以用首字母缩写词“ SAM”来表示,它代表“单一抽象方法”。 例如:

interface Runnable { void run(); } interface Function { public R apply(A a); } interface IntFun extends Function {} // equals is defined by java.lang.Object, so this only has one abstract method 
interface Comparator { boolean equals(Object obj); int compare(T o1, T o2); 
}

因此,通过确保使用保持这些约束的接口,当前正在编写/正在编写的任何API都可以被lambda使用。 Guava库是一个已经鼓励有限的函数编程风格的示例API。

更有趣的例子

经验丰富的函数式程序员会意识到map函数,该函数会为您返回一个新列表,其中每个值都由函数更改。 在番石榴世界中,此功能称为“变换”。 这是您今天可以编写的一些Java代码示例,使用它来递增列表:

Collection result = transform(newArrayList(1, 2, 3), new Function() { @Override public Integer apply(Integer x) { return x + 1; } 
});

这是一个高阶函数的示例,即以函数为参数或返回函数的函数。 转换功能使迭代集合的过程抽象化,并建立一个新的集合,从而可以编写更多抽象的高级代码。 不幸的是,由于强制使用了许多行噪声,因此在一定程度上克服了可读性的优势,但是如果您使用lambda重写它:

Collection result = transform(newArrayList(1, 2, 3),x -> x + 1);

另一个常用的高阶函数是滤波函数。 如果为它提供一个集合和一个谓词,它将返回一个新集合,其中包含谓词对其适用的旧集合中的元素。 这是一个用匿名内部类样式和lambda表达式方式编写的代码示例。

Collection threeAndFive = filter(newArrayList(1, 3, 5), new Predicate() { @Override public boolean apply(Integer x) { return x > 2; } 
}); Collection threeAndFiveByLambda = filter(newArrayList(1, 3, 5),x -> x > 2);

方法参考

当然,您可能已有一个已经定义了许多方法的现有代码库,您希望使用它们代替lambda。 目前,这在Java中使用匿名内部类也是可能的,但同样麻烦。 除了提供lambda表达式外,JSR 335还提出了一些语法糖,以使此过程更容易。 您可以使用'::'符号作为已编写的现有方法的方法参考。 这是前面的示例,但是使用了方法参考:

// Existing method 
public static boolean greaterThanTwo(Integer x) { return x > 2; 
} // prints [3, 5] 
System.out.println(filter(newArrayList(1,3,5),LambdasExample::greaterThanTwo));

他们真的是闭包吗?

在引言中,我提到过lambda表达式可以称为closures 。 这意味着一个函数能够引用其正常范围之外的变量,或者被封闭在周围范围的自由变量之上。

int value = 5; IntFun addValue = x -> x + value;

在此代码示例中,“ addValue”函数能够在周围的范围内引用名为“ value”的变量,尽管对此有一些警告。 如果您之前编写过匿名内部类,那么您会记得它们只能引用标记为final的周围变量,即未分配给它们。 这里的限制是相似的,只是它已被概括为最终有效的限制 。 简而言之,您可以引用未分配给多个变量的变量。 原理是,如果将变量标记为final或可以将其标记为final而不引入编译器错误,则该变量实际上是final。

尝试和链接

lambdas规范的早期草案审核的一部分已经在线发布,并且如果您想了解正在发生的事情的来龙去脉,那么这可能对您来说很有趣。 如果您有兴趣尝试编写一些lambda代码,则已经有二进制快照 。 这些内容经常更新,如果您想了解lambda内部结构的实质,可以尝试构建源代码 。 关于使用二进制代码编写代码的唯一警告是,由于它仍处于草稿版本中,并且仍使用“#”运算符代替“ ::”作为方法参考语法,因此它仍然存在一些bug。

摘要

这是对Java 8 Lambda表达式的一些概念的介绍,因此简化了所涉及的一些问题,但是对于读者来说,了解即将发生的事情应该足够了。 很高兴看到Oracle在事物的语言方面引入了一些有用的更改,这种更改已经停滞了一段时间。

参考: Lambdas:来到您附近的Java 8! 从我们的JCG合作伙伴 Richard Warburton在Insightful Logic博客上获得。

翻译自: https://www.javacodegeeks.com/2013/07/lambdas-coming-to-a-java-8-near-you.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPU-内存-IO-网络调优

一、关于CPU 中央处理器调优 1、 CPU处理方式: 批处理,顺序处理请求。(切换次数少,吞吐量大)分时处理。(如同"独占",吞吐量小)(时间片,把请求分为一个一个的时间片,一片一片的分给CPU处理)我们现…

spark抽取mysql数据到hive_使用spark将内存中的数据写入到hive表中

使用spark将内存中的数据写入到hive表中hive-site.xmlhive.metastore.uristhrift://master:9083Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.javax.jdo.option.ConnectionURLjdbc:mysql://master:3306/metastore?createDa…

使用Merge存储引擎实现MySQL分表

使用Merge存储引擎实现MySQL分表 学习了:https://www.cnblogs.com/try-better-tomorrow/p/4987620.html https://www.cnblogs.com/xbq8080/p/6628034.html http://blog.csdn.net/java_bruce/article/details/71077985 https://www.cnblogs.com/johnnyzhang/articles…

Flexible 弹性盒子模型之CSS flex-shrink 属性

实例 让第二个元素收缩到其他元素的三分之一: 效果预览 div:nth-of-type(2){flex-shrink:3;}浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 属性 flex-shrink29.021.…

使用Base64

为什么要使用Base64?在设计这个编码的时候,我想设计人员最主要考虑了3个问题: 1.是否加密? 2.加密算法复杂程度和效率 3.如何处理传输? 加密是肯定的,但是加密的目的不是让用户发送非常安全的Email。这…

idea 新建的java项目没发run_IntelliJ IDEA创建普通的Java 项目及创建 Java 文件并运行的教程...

最近突然看到这篇几年前随手记录的文章,居然浏览量那么高。看来很多小伙伴也开始从 Eclipse 转到 IDEA,这里为了让大家更好的掌握 IDEA 的使用,我建议大家可以看看下面这个 IDEA 教程。首先,确保 IDEA 软件正确安装完成&#xff0…

如何在Maven中运行Ant目标?

maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标。 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法。 通常,使用maven build,您会将项目捆绑到war文件或ear文件中。 您可以使用maven-antrun-plugin直接将此w…

PHP基本知识

php为服务端的脚本语言&#xff0c;它的使用需要打开WAMP的开发环境&#xff0c;php也可以用制作网页的DW制作&#xff0c;文件需保存在wamp文件夹内的www文件夹里面。 嵌入php代码所使用的标签&#xff1a;<?php ?>&#xff1b; 运行php条件&#xff1a; 1.电脑上需…

java semaphore 等待_Java并发编程系列之Semaphore详解

简单介绍我们以饭店为例&#xff0c;假设饭店只有三个座位&#xff0c;一开始三个座位都是空的。这时如果同时来了三个客人&#xff0c;服务员人允许他们进去用餐&#xff0c;然后对外说暂无座位。后来的客人必须在门口等待&#xff0c;直到有客人离开。这时&#xff0c;如果有…

BZOJ1191: [HNOI2006]超级英雄Hero(二分图匹配)

Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5860 Solved: 2617[Submit][Status][Discuss]Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金。主持人问题准备了若干道题…

bzoj 2137: submultiple

Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 239 Solved: 113[Submit][Status][Discuss]Description 设函数g(N)表示N的约数个数。现在给出一个数M&#xff0c;求出所有M的约数x的g(x)的K次方和。 Input 第一行输入N&#xff0c;K。N表示M由前N小的素数组成。接下来N行&…

Java垃圾收集蒸馏

串行&#xff0c;并行&#xff0c;并发&#xff0c;CMS&#xff0c;G1&#xff0c;Young Gen&#xff0c;New Gen&#xff0c;Old Gen&#xff0c;Perm Gen&#xff0c;Eden&#xff0c;Tenured&#xff0c;Survivor Spaces&#xff0c;Safepoints和数百个JVM启动标志。 在尝试…

设计模式(二)模板方法模式

1.模版方法模式简介 模版方法模式介绍 在软件开发中&#xff0c;有时会遇到类似的情况&#xff0c;某个方法的实现需要多个步骤&#xff0c;其中有些步骤是固定的&#xff0c;而有些步骤并不固定&#xff0c;存在可变性。为了提高代码的复用性和系统的灵活性&#xff0c;可以…

命令行程序

1 package com.jdk7.chapter1;2 3 /**4 * 命令行程序5 * author celineluo6 *7 */8 public class CommandArgs {9 /** 10 * 调用系统错误方法打印错误信息 11 * 调用exit()关闭java虚拟机&#xff0c;0表示正常退出应用程序&#xff0c;其他值表示异常退出应…

题解 P2598 【[ZJOI2009]狼和羊的故事】

P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂&#xff0c;谁让他们真爱了一场&#xff1b;狼爱上羊啊并不荒唐&#xff0c;他们说有爱就有方向&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;” Orez听到这首歌&#xff0c;心想&am…

Spring Data Solr教程:排序

当我们实现单词搜索功能时&#xff0c;我们通常希望通过使用每个搜索结果的相关性以降序对搜索结果进行排序。 这也是Solr的默认行为。 但是&#xff0c;在某些情况下&#xff0c;有必要手动指定排序顺序。 一种此类情况是“常规”搜索功能的实现&#xff0c;该功能已在我的Sp…

浅谈Java中的hashcode方法

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生&#xff0c;而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: 1public native int hashCode();根据这个方法的声明可知&#xff0c;该方法返回一个int类型的数值&#xff0c;并…

前端机试面试题

一、题目要求 1、请实现“https://channel.jd.com/fashion.html”超值购部分内容。 2、使用CSS DIV实现页面布局&#xff0c;页面居中&#xff0c;文字颜色效果要求一致。40分 3、鼠标悬停时的动画效果。10分 4、“进入查看”标签与样式。10分 5、定义一个javascript数组&…

三分大法好

三分算法解决凸形或者凹形函数的极值&#xff1b; 如下图 lmid (Left Right) / 2 rmid (lmid Right) / 2; 如果lmid靠近极值点&#xff0c;则Right rmid&#xff1b; 否则(即midmid靠近极值点)&#xff0c;则Left lmid; 例题的话在我的博客相关分类中找. 转载于:https://w…

java stopself_如何正确停止前台服务?

我不知道它是否正确,但在我的应用程序中,我正在停止前台服务,它可以工作。请检查代码private void stopForegroundService() {// Stop foreground service and remove the notification.stopForeground(true);// Stop the foreground service.stopSelf();}更新打电话给stopserv…