java 8 lambda_Java 8的烹调方式– Lambda项目

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

java 8 lambda

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

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

相关文章

我的Serverless实战——引领云计算的下一个十年

前言&#xff1a;如今&#xff0c;越来越多的大厂企业开始大规模使用Serverless&#xff0c;处于变革中的开发者&#xff0c;大多已从观望状态转向尝试阶段&#xff0c;越来越多Serverless落地场景被解锁。作为基础研发底座&#xff0c;越来越多企业开始接受Serverless&#xf…

各种边距clientWidth、offsetWidth、scrollWidth、clientLeft、getBoundingClientRect详解

1、clientWidth、offsetWidth、scrollWidth <!DOCTYPE html> <html><head><meta charset"utf-8" /><style>#box1 {padding: 50px;position: static;}#box {border: 1px solid red;overflow: scroll;height: 200px;width: 500px;}#con…

encodeURIComponent的使用

URL 元字符&#xff1a;分号&#xff08;;&#xff09;&#xff0c;逗号&#xff08;,&#xff09;&#xff0c;斜杠&#xff08;/&#xff09;&#xff0c;问号&#xff08;?&#xff09;&#xff0c;冒号&#xff08;:&#xff09;&#xff0c;at&#xff08;&#xff09;&a…

如何以及何时使用枚举和注释

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的过程&#xff01; 在这里查看 &#xff01; 目录 1.简…

花了两天时间用html+css+js做了一个网页版坦克大战游戏

大家好&#xff0c;我是孙叫兽&#xff0c;本期内容给大家分享如何用htmlcssjavaScript去做一个简易网页版坦克游戏。 目录 坦克游戏玩法及介绍 项目结构 源码地址&#xff1a; 坦克游戏玩法及介绍 我们先来看一下首页。 打开这个首页很简单&#xff0c;基本是上面这个样子&…

软件工程第一次冲刺进度条(1-10天)

第一天&#xff08;4.20&#xff09;昨天做了什么今天做了什么遇到的问题配置安装所需要的环境和相关软件 查询android关于界面编程与视图的相关资料并且初步编写代码 配置虚拟机的时候电脑上总是失败第二天&#xff08;4.21&#xff09;昨天做了什么今天做了什么遇到的问题查询…

css基础过渡与动画与应用于vue、react

一、css属性过渡transition 1、解释&#xff1a; 使用该属性后变化不会在一瞬间完成&#xff0c;会有一个连续的变化效果。第一个参数设置哪些属性变化时需要有连续的效果。 不论用什么方式使属性的值发生变化&#xff0c;transition都会生效。 2、语法&#xff1a; trans…

Android项目开发填坑记-Fragment的onAttach

背景 现在Android开发多使用一个Activity管理多个Fragment进行开发&#xff0c;不免需要两者相互传递数据&#xff0c;一般是给Fragment添加回调接口&#xff0c;让Activity继承并实现。 回调接口一般都写在Fragment的onAttach()方法中&#xff0c;Fragment 3.0 的onAttach()方…

前端开发——移动端及响应式布局解决办法总结(适配)

问题分析:前端开发一个产品(网站、系统、APP等)会遇到的一个难点就是适配问题,比如开发一个网站,你在一个页面开发的时候从视觉看起来没什么异样,换个不同分别率的设备,电脑,手机等,发现样式全乱了,这个不是我们想要的结果,所以,浏览器适配,响应式布局就显得尤为重…

来点小技巧,Array.filter(Boolean)、 [].slice.call(this)等等

1、Array.filter(Boolean) 移除所有的 ”false“ 类型元素 (false, null, undefined, 0, NaN or an empty string)。 Boolean 是一个函数相当于直接传了个函数进去 Array.filter(Boolean)Array.filter(i>Boolean(i)) Array.filter(i>i) let a [1, 2, b, 0, {}, , N…

设置文字多行显示溢出显示省略号

#news_text { border: 1px solid red; width: 200px; word-break: break-all; text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; /*这里可以设置文本显示的行数*/ overflow: hidden; }<div id"news_text"&g…

vue项目有几个接口content Download时间特别长的解决办法

做的可视化地图项目&#xff0c;有几个接口加载比较慢&#xff0c;大概16S左右&#xff0c;第一次加载接近一分钟&#xff0c;这谁能受得了。 对比了正式环境和测试环境&#xff0c;这个接口数据量一样&#xff0c;就是在测试服务器比较慢&#xff0c;排除滚动插件及其它的影响…

Java中集合的自定义运算符

总览 操作员重载有多种语言可用。 Java对String类型的运算符的支持对运算符的重载非常有限。 我们可以利用其他语言支持运算符的不同方式&#xff0c;但是可以在Java中实现一个使用Java已经使用的约定的实现。 获取&#xff0c;设置和放置操作 集合的运算符重载的一个常见示例…

【Java从入门到天黑|03】JavaSE入门之流程控制

大家好,我是孙叫兽,本期内容给大家分享一下JavaSE入门之流程控制。 用户交互Scanner 1、Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner 是 Java5 的新特征,我们可以通过…

Jmeter调试工具---HTTP Mirror Server

转自&#xff1a;http://www.cnblogs.com/puresoul/p/4907655.html 一、HTTP Mirror Server的作用&#xff1a; 它可以在本地临时搭建一个HTTP服务器&#xff0c;该服务器把接收到的请求原样返回&#xff0c;这样就可以看到发送出的请求的具体内容&#xff0c;以供调试。 二、…

520 单身福利|女朋友又找我要礼物

大家好&#xff0c;我是孙叫兽&#xff0c;520快到了&#xff0c;给大家分享一下单身福利&#xff01;时间过得真快&#xff0c;一转眼又到了 520&#xff0c;有对象的程序员又激动又扎心的节日&#xff0c;其实吧&#xff0c;程序员对这种节日又期待又焦灼&#xff0c;为什么呢…

pit和systick_PIT和TestNG突变测试简介

pit和systick变异测试是一种技术&#xff0c;它可以发现测试未涵盖代码的哪些部分。 它类似于代码覆盖范围 &#xff0c;但变异测试不限于在测试期间执行给定行的事实。 这个想法是修改生产代码&#xff08;引入突变&#xff09;&#xff0c;这应该改变其行为&#xff08;产生不…

使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法

引言&#xff1a;做可视化地图项目&#xff0c;使用vue-seamless-scroll实现表格数据自动滚动&#xff0c;有个bug就是复制出来的数据点击事件失效。这个插件底层的实现是cope的形式&#xff0c; 无限滚动原理&#xff1a;无限滚动的原理就是把之前的遍历的内容复制一份&#x…

最短路的几种算法及其优化(模板)

一.Dijkstra 算法 dijkstra算法适用于边权为正的情况&#xff0c;求单源最短路&#xff0c;适用于有向图和无向图 模板伪代码&#xff1a; 清除所有点的标号 设d[0]0&#xff0c;其余d[i]INF&#xff1b; 循环n次{ 在所有未标记的节点中&#xff0c;寻找d[i]最小的点x 给x做标记…

极客青年说,北京沙龙

大家好&#xff0c;我是孙叫兽&#xff0c;本期内容给大家分享infoq写作平台在北京站的沙龙主题。主要流程如下&#xff1a;早上起来&#xff0c;吃了点饭&#xff0c;然后就去北京望京悠乐汇的A1202,这次是个轰趴馆&#xff0c;比较适合年轻的程序员放松。去的稍微早了点&…