Java 8的烹调方式– Lambda项目

什么是project lambda :Project lambda是用于以Java语言语法启用lambda表达式的项目。 Lambda表达式是功能编程语言(如lisp)中的主要语法。 Groovy将是支持lambda表达式(也称为闭包)的java的最接近亲戚。

那么什么是lambda表达式? 它是一块代码块,可以像分配任何其他数据一样,将其分配给变量或作为参数传递给方法,或作为参数传递给另一个lambda表达式。 该代码也可以在需要时被调用。 在Java中支持此功能的主要动机是,在使用某些需要API用户提供一些代码的API时,删除了许多样板代码,但由于Java的语法要求,最终使用了内部类。 最常见的此类API是Java线程API,我们需要能够告诉该API在新线程中执行哪些代码,但最终实现Runnable。

该规范仍在开发中,并且正在不断变化。 本文只是给出了一个关于期望的想法。

功能接口 :Java规范开发人员几乎从未希望修改JVM规范,这种情况也不例外。 因此,他们以某种方式制定规范,以便可以在不对JVM进行任何修改的情况下实现lambda。 因此,您可以使用源版本1.8和目标版本1.5轻松编译类。

因此,lambda代码将保留在匿名类的实现中,该类实现的接口只有一个方法。 很好,不完全是,该接口可以有多个方法,但是它必须可由仅定义一个方法的类实现。 我们将这种接口称为功能接口。 以下是功能接口的一些示例。

//A simple case, only one method
//This is a functional interface
public interface Test1{public void doSomething(int x);
}//Defines two methods, but toString() is already there in
//any object by virtue of being subclass of java.lang.Object
//This is a functional interface
public interface Test2{public void doSomething(int x);public String toString();
}//The method in Test3 is override compatible with 
//the method in Test1, so the interface is still 
//functional
public interface Test3 extends Test1{public void doSomething(int x);
}//Not functional, the implementation must 
//explicitly implement two methods.
public interface Test4 extends Test1{ public void doSomething(long x);
}

Lambda表达式 :在Java 8中,lambda表达式只是使用匿名类实现功能接口的不同语法。 语法的确比创建匿名类的语法简单得多。 语法主要是这种形式:

argumentsList->正文

argumentsList就像java方法参数列表一样-用逗号分隔并括在括号中,但有一个例外-如果只有一个参数,则括号是可选的。 也可以选择提及参数的类型。 如果未指定类型,则将推断它们。 主体可以有两种类型-表达式主体和代码块主体。 表达式主体只是返回值的有效Java表达式。 就像方法主体一样,代码块主体包含一个代码块。 代码块主体具有与方法主体相同的语法,包括必需的大括号。

以下示例显示了如何使用lambda语法实现新线程。

//The thread will keep printing "Hello"
new Thread(() -> { while(true){ System.out.println("Hello"); }}).start();

下面的示例显示了表达式语法

public interface RandomLongs{public long randomLong();
}RandomLongs randomLongs = () -> ((long)(Math.random()*Long.MAX_VALUE));
System.out.println(randomLongs.randomLong());

泛型和lambda :但是,如果我们想使用lambda实现泛型方法,该怎么办? 规范开发人员提出了一种不错的语法,即在类型参数之前声明类型参数。 下面显示了一个示例–

public interface NCopies{public <T extends Cloneable> List<T> getCopies(T seed, int num);
}//Inferred types for arguments also supported for generic methods
NCopies nCopies = <T extends Cloneable> (seed, num) -> { List<T> list = new ArrayList<>(); for(int i=0; i<num; i++) list.add(seed.clone()); return list;};

需要注意的一点 :lambda表达式实现的实际接口和方法取决于使用它的上下文。 可以通过存在赋值操作或通过在方法调用中传递参数来设置上下文。 没有上下文,lambda毫无意义,因此直接在lambda表达式上直接调用方法是不正确的。 例如,以下内容将给出编译错误–

public interface NCopies{public <T extends Cloneable> List<T> getCopies(T seed, int num);
}//This code will give a compilation error,
//As the lambda is meaningless without a context
(<T extends Cloneable> (seed, num) -> { List<T> list = new ArrayList<>(); for(int i=0; i<num; i++) list.add(seed.clone()); return list;}).getCopies(new CloneableClass(), 5);However, the following would be perfectly alright, because there is an assignment context for the lambda. NCopies nCopies = <T extends Cloneable> (seed, num) -> { List<T> list = new ArrayList<>(); for(int i=0; i<num; i++) list.add(seed.clone()); return list;};nCopies.getCopies(new CloneableClass(), 5);

精简的lambda :Lisp对lambda的支持比这要灵活得多。 整个lisp语言都基于lambda。 但是,java必须限制语法使其适合自己的语法。 此外,lisp是一种解释型语言,具有在所有信息可用时在运行时执行操作的优势。 Java是一种编译语言,它必须遵守更为严格的类型和控制流等规则,以免在运行时产生意外。 考虑到这一点,在Java 8中精简的lambda看起来并不那么糟糕。

参考: Java 8中的烹饪方法–来自JCG合作伙伴的 Lambda项目   极客文章博客上的Debasish Ray Chawdhuri。


翻译自: https://www.javacodegeeks.com/2012/02/whats-cooking-in-java-8-project-lambda.html

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

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

相关文章

ffmpeg文档38-视频源

38 视频源 下面是当前有效的视频源 buffer 缓冲视频帧&#xff0c;其可以作为滤镜链图的环节 它通常用于编程&#xff0c;特别是通过libavfilter/vsrc_buffer.h的接口。 接受如下参数&#xff1a; video_size 指定视频尺寸&#xff0c;(同时指定width 和 height)。语法同于ffmp…

系统架构的演变 -----自 罗文浩

转自&#xff1a;https://my.oschina.net/lwhmdj0823/blog/617713版权声明&#xff1a;罗文浩所有摘要: 一个成熟的大型网站&#xff08;如淘宝、京东等&#xff09;的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性&#xff0c;它总是随着用户量的增加&#x…

前端请求接口post_前端如何优雅地模拟接口请求?(给你的代码加点小意外)

前言&#xff1a;作为一名前端开发程序猿&#xff0c;每天都被产品经理催着开发&#xff0c;项目一启动&#xff0c;产品就过来了。嘘寒问暖&#xff1a;大胸弟&#xff0c;你啥时开始做啊&#xff1f;一般我们都会直接告诉TA&#xff0c;你先找接口解决数据问题。而我们也会经…

cron表达式详解

Cron表达式是一个字符串&#xff0c;字符串以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&#xff0c;Cron有如下两种语法格式&#xff1a; Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month …

将Ehcache添加到Openxava应用程序

介绍 本文介绍如何在Openxava应用程序上快速启用Ehcache&#xff0c;从而提高性能。 查看实体及其图时&#xff0c;将加载关系。 添加第二级缓存可加快关联元素的检索速度&#xff0c;因为已加载的元素是从缓存而不是数据库中检索的。 最终&#xff0c;该页面解释了分钟项目如…

java mongodb 返回所有field_JAVA高级之反射

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;今天跟大家分享JAVA高级之反射的知识。一、什么是反射反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所以属性和方法&#xff1b;对于…

Linux入门笔记——cal、date、free、clear、history、man、whatis、uname

1、cal 显示日历2、date 显示系统当前的日期和时间3、df查看磁盘剩余空间的数量&#xff0c;常用参数 -h &#xff08;human&#xff09;人性化显示内容4、free显示空闲内存的数量&#xff0c;常用参数 -h &#xff08;human&#xff09;人性化显示内容5、clear清除控制终端显示…

使用ASM 4处理Java类文件–第一部分:世界,您好!

什么是ASM &#xff1a;ASM是一个用于处理Java字节码的开源Java库。 因此&#xff0c;它具有与Apache BCEL相同的目的。 由于本文假定读者具有Java类文件格式的某些知识&#xff0c;因此建议在此处进行阅读。 那么它与BCEL有何不同&#xff1f; 首先&#xff0c;它允许使用事件…

(转)C#程序开发中经常遇到的10条实用的代码

原文地址&#xff1a;http://www.cnblogs.com/JamesLi2015/p/3147986.html 1 读取操作系统和CLR的版本 OperatingSystem os System.Environment.OSVersion; Console.WriteLine(“Platform: {0}”, os.Platform); Console.WriteLine(“Service Pack: {0}”, os.ServicePack); …

Ueditor的配置及使用

Ueditor官网&#xff1a;http://ueditor.baidu.com/website/ &#xff08;项目需要JSP版本&#xff1a;UTF-8版&#xff09; 1.配置 <script type"text/javascript" charset"utf-8">window.UEDITOR_HOME_URL "${ctx}/assets/plugins/uedi…

努比亚z17s刷原生安卓_电脑运行手机APP,不会没关系,我推荐你使用显卡服务器运行安卓模拟器...

很多人都想用电脑端运行手机APP&#xff0c;但是又不知道怎么操作。纵横170yun小编推荐大家使用显卡服务器&#xff0c;在显卡服务器上运行安卓模拟器。让你轻轻松松在电脑端运行手机APP&#xff0c;甚至还可以多开噢 。如果你的电脑没有显卡&#xff0c;也没有关系&#xff0c…

Linux入门笔记——系统目录结构

目录 评论 / 根目录&#xff0c;万物起源。 /bin 包含系统启动和运行所必须的二进制程序。 /boot 包含 Linux 内核&#xff0c;最初的 RAM 磁盘映像&#xff08;系统启动时&#xff0c;由驱动程序所需&#xff09;&#xff0c;和 启动加载程序。 有趣的文件&#xff1a; /boot/…

线程故事:关于健壮的线程池

我的主题系列的另一个博客。 这次是关于线程池&#xff0c;尤其是可靠的线程池设置。 在Java中&#xff0c;线程池由Java 5中引入的ThreadPoolExecutor类实现。该类的Javadoc组织得很好。 因此&#xff0c;我不遗余力地在此处进行概述。 基本上&#xff0c; ThreadPoolExecutor…

css缩写

颜色&#xff1a; 16进制的色彩值为六位数&#xff0c;如果每两位的值相同&#xff0c;可以缩写一半。 如&#xff1a;#000000#000&#xff1b; #223344#234&#xff1b; 盒子的尺寸&#xff1a; 如margin:value; 一个值表示所有边&#xff0c;两个值表示上下&#xff0c;左右&…

win10改成ubundu主题_如何将ubuntu引导win10,修改为win10引导ubuntu

、首先用LiveCD进入ubuntu2、打开终端&#xff0c;输入&#xff1a;fdisk -l 查看自己linux的分区情况&#xff0c;我的分了4个区&#xff0c;swap&#xff0c;boot&#xff0c;/&#xff0c;home&#xff0c;对应的分别是&#xff1a;/dev/sda9 swap/dev/sda10 boot/dev/sda11…

Linux入门笔记——文件操作命令1

pwd Print name of current working directory&#xff08;打印出当前工作目录名&#xff09; cd Change directory&#xff08;更改目录&#xff09;例子&#xff1a;cd 更改工作目录到你的家目录&#xff08;和cd ~命令的运行结果是等同的 &#xff09;cd - 更…

使用MJRefresh自定义下拉刷新,上拉加载动画

有时候我们需要自己设置下拉刷新,上拉加载动画的实现,这里主要是记录下使用MJRefresh自定义下拉刷新,上拉加载动画..... 下拉刷新我们只需要继承MJRefreshGifHeader即可: 实现代码如下: - (void)prepare{[super prepare];self.stateLabel.hidden NO;self.lastUpdatedTimeLabel…

2.mybatis入门实例 连接数据库进行查询

1.新建项目&#xff0c;添加mybatis和mysql的jar包 2.在mysql中新建表user[id,name,age] CREATE TABLE users (id int(11) NOT NULL auto_increment,NAME varchar(50) default NULL,age int(11) default NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8 3.新建User类…

使用JacpFX和JavaFX2构建富客户端

创建快速且可扩展的桌面客户端始终是一个挑战&#xff0c;特别是在处理大量数据和长时间运行的任务时。 尽管Eclipse RCP和Netbeans RCP是已建立的平台&#xff0c;但其想法是建立一个轻量级的框架来异步处理组件&#xff0c;类似于Web组件。 开发人员在线程主题上的工作应较少…

lob移表空间 oracle_Oracle数据库(1)Oracle体系结构概述(一)

Oracle数据库的体系结构主要包括&#xff1a;物理存储结构、逻辑存储结构、内存结构和实例进程结构。了解了Oracle的体系结构&#xff0c;就可以对Oracle数据库有一个整体认识&#xff0c;这样有利于后续Oracle的学习。下面我们分别来了解逻辑存储结构、物理存储结构、内存结构…