什么是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项目相关推荐

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

    java 8 lambda 什么是project lambda :Project lambda是用于以Java语言语法启用lambda表达式的项目. Lambda表达式是功能编程语言(如lisp)中的 ...

  2. Java 8的烹调方式–拼图项目

    什么是Project Jigsaw:Project Jigsaw是使Java编译器模块知道的项目. 多年以来,Java API一直是整体的,即从代码的任何部分都可以平等地看到整个API. 还没有任何方 ...

  3. p1417 烹调方案_Java 8的烹调方式–拼图项目

    p1417 烹调方案 什么是Project Jigsaw:Project Jigsaw是使Java编译器模块知道的项目. 多年以来,Java API一直是单块的,即从代码的任何部分都可以平等地看到整个 ...

  4. java wrapper怎么运行_java wrapper方式部署项目

    java项目部署的方式多种多样,目前springboot框架下都是自带tomcat等服务运行环境的,也可以直接将编译包后的jar包解压后运行起来,今天要介绍的是用wrapper的方式部署项目,这种方式 ...

  5. java改变变量编码方式_Java 10将如何改变您的编码方式

    java改变变量编码方式 突出显示Java 10中新的Java局部变量类型推断功能 早在2016年,Java社区就掀起了新的JDK增强提案(JEP): JEP 286 . 现在,两年后,局部变量类型推 ...

  6. Lambda项目:迈向多核及超越

    周一下午在JavaOne 2011的希尔顿旧金山大宴会厅B上做了" Project Lambda:迈向多核和超越"(会议27400,不要与Brian Goetz的同名演讲相混淆) ...

  7. Java学习路线图分享(含项目+面试提升)最全整理

    为大家整理了2022最新的Java学习路线图,从学前准备.学习路线.项目实战.面试提升等四个方面给大家分享一些经验,希望可以给学习Java的小伙伴们一些帮助. 个人学习经验: 我本人是计算机科班出身, ...

  8. linux运行dock打包的镜像,Linux部署之Docker方式部署项目

    Linux部署之Docker方式部署项目 1. 使用Docker对前端vue项目进行部署 1.1 环境准备 服务器或者虚拟机上先安装好Nginx和相关配置 docker pull nginx 拉去最新 ...

  9. Java 8 vs. Scala之Lambda表达式

    [编者的话]2014年3月份众人期待已久的Java 8发布了,新版本从语言.编译器.类库和工具等方面对Java进行了诸多改进与提升,一时间风光无限:而JVM体系的另一门语言Scala则因为融合了函数式 ...

最新文章

  1. Ardino基础教程 16_一位数码管
  2. java位运算实例详解——(amp;)、(|)、(~)、(^)、(lt;lt;)、(gt;gt;)
  3. [C#]泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,ListT,DictionaryTkey,Tvalue,SortedListTkey,Tvalue,...
  4. 一个Java对象到底占多大内存?(转)
  5. 周正宁:研发最大的挑战是不断否定常规 否定自己
  6. 干货|如何在无回显时渗透
  7. Java BIO、NIO、AIO的区别
  8. 利用循环神经网络生成唐诗_PyTorch实现用于文本生成的循环神经网络
  9. linux下删除已经创建的数据库,MongoDB 数据库的创建和删除
  10. php 破解加密帖子,某PHP加密文件解密过程初探 · 浮萍’s Blog
  11. L1-050 倒数第N个字符串-PAT团体程序设计天梯赛GPLT
  12. MySQL下载和安装教程
  13. 基于SSM的宠物领养网站
  14. Windows下的发包工具推荐[Colasoft Packet Builder]含使用教程
  15. 微信公众平台开发3-微信服务器IP接口实例(含源码)
  16. 阿里天池比赛——食物声音识别
  17. 2022—SWJTU-寒假ACM校队选拔赛第一场-题解
  18. Access根据出生日期计算年龄_WPS表格技巧—如何根据出生年月日求虚岁年龄
  19. WebStorm 2016 最新安装指南 破解 汉化 字体设置
  20. 再度公开少林内修心法 易筋经和洗髓经 欢迎转载 让全人类共享学习 过得更健康

热门文章

  1. java数据库编程——执行查询操作(二)
  2. git log 迁移_现场故事:从Log4J迁移到Log4J2
  3. map iterator_一个简单的Map Iterator性能测试
  4. maven与spring_与Spring和Maven签约首个SOAP服务
  5. ios 静音模式_静音设计模式
  6. java分割句子_关于Java的一些句子
  7. Project Reactor展开方法
  8. javaml_一些基于Java的AI框架:Encog,JavaML,Weka
  9. stackexchange_通过Spring Social推特StackExchange –第1部分
  10. pdf保存如何带批注_带有批注的SpringSelenium测试