Java –远景JDK 8

世界正在缓慢但肯定地发生变化。 在进行了更改之后,使Java有了JDK 7的全新外观,Java社区期待JDK 8以及JDK 9附带的其余改进。
JDK 8的目标目的是填补JDK 7实施中的空白-该实施中剩下的部分难题,应该在2013年底之前为广大读者所用,目的是改善和增强JDK 7中的语言。三个特定方向:

  • 生产率
  • 性能
  • 模块化

因此,从明年开始,java将在所有地方(移动,云,桌面,服务器等)运行,但是会以一种改进的方式运行。 在接下来的内容中,我将简短概述一下2013年的期望-紧接新年决议发布-之后,我将主要关注生产率方面,重点是项目lambda以及它的引入将如何影响我们的编码方式。

生产率

在生产力方面,JDK 8的目标是两个主要领域:–集合–通过引入语言的文字扩展与集合进行交互的更便捷的方式–注释–增强了对注释的支持,允许将注释写在当前非法的环境中(例如原语)

性能

向JDK 7添加Fork / Join框架是Java朝多核CPU迈出的第一步。 JDK 8通过为Java提供闭包支持(即lambda表达式),进一步走了这条路。 Java受影响最大的部分可能是Collections部分,闭包与新添加的接口和功能相结合,将Java容器推向了新的高度。 除了编写更具可读性和更短的代码之外,通过向集合提供将在内部执行的lambda表达式,平台可以利用多核处理器。

模块化

社区中最令人感兴趣的作品之一是项目拼图:“此项目的目标是为Java SE平台设计和实现标准模块系统,并将该系统应用于平台本身和JDK。” 我使用过去式,是因为对于那些希望摆脱类路径和类加载器的人来说,我们不得不推迟对Java 9的使用,因为那时候项目Jigsaw也被推迟了 。

要更清晰地了解剩余的Java路线图2013:

  • 2013/01/31 M6功能完成
  • 2013/02/21 M7开发人员预览
  • 2013/07/05 M8最终版本候选
  • 2013/09/09 GA全面上市

除了项目拼图之外,即将出现的另一个重大变化(在此版本中)是对闭包的支持。 通过lambda表达式的帮助,它们将改善JDK的关键点。

Lambdas

入门

首先,首先应该获得启用了lambda的SDK。 在这个方向上,有两种获取方法:

*适用于勇敢者的一种:从源头构建

*方便的一种:下载已经编译的SDK版本

最初,我从源头开始构建它,但是由于时间紧缺以及与环境变量有关的警告过多,我选择了惰性方法并采用了现有的JDK。 另一个重要的工具是用于编写代码的文本编辑器。 直到现在,它还是最先发布了JDK版本,并在一段时间后启用了IDE。 这次有所不同,这可能还归因于openjdk提供的SDK的透明性和广泛可用性。 几天前,JetBrain实现了第一个启用Java 8的IDE。 因此,IntelliJ IDEA 版本 12是第一个提供对JDK 8支持的IDE,此外还有改进之处吗? 因此,出于测试目的,我在Windows 7,x64计算机上将IntelliJ 12 Community Edition与JDK 8 b68一起使用。 对于那些喜欢Netbeans的人,可以下载具有lambda支持的每晚构建。

调整为适当的心态。

在开始使用新提供的功能来编写经过改进和简洁的代码之前,必须先掌握几个新概念,无论如何我还是需要的。

    • 什么是lambda表达式? 查看lambda表达式的最简单方法就像一种方法:“它提供了形式参数的列表,以及根据这些参数表示的主体(表达式或块)。lambda表达式的参数可以声明或推断。 ,当形式参数具有推断的类型时,则这些类型是从lambda表达式所针对的功能接口类型派生的。 从返回值的角度来看,lambda表达式可以是void兼容的-它们不返回任何值或值兼容-如果任何给定的执行路径返回值。
      lambda表达式的示例:
      (a) (int a, int b) -> a + b(b) (int a, int b) -> {if (a > b) {return a;} else if (a == b) {return a * b;} else {return b;}}
    • 什么是功能接口? 功能接口是仅包含一个抽象方法的接口,因此表示单个方法协定。 在某些情况下,单个方法可能具有带有等效替代签名的多个方法,在这种情况下,所有方法都代表一个方法。 除了通过创建和实例化类来创建接口实例的典型方式之外,还可以通过使用lambda表达式,方法或构造函数引用来创建功能接口实例。
      功能接口示例:
      // custom built functional interface
      public interface FuncInterface {public void invoke(String s1, String s2);
      }

      JAVA API的功能接口示例:

      java.lang.Comparablejava.lang.Runnablejava.util.concurrent.Callablejava.awt.event.ActionListener

      因此,让我们看看线程的开始将来可能如何变化:
      旧方法:

      new Thread(new Runnable() {@Overridepublic void run() {for (int i=0; i< 9; i++) {System.out.println(String.format('Message #%d from inside the thread!', i));}}}).start();

      新方法:

      new Thread(() -> {for (int i=0; i< 9; i++) {System.out.println(String.format('Message #%d from inside the thread!', i));}}).start();

      即使我有一段时间没有编写任何与Java Swing,AWT相关的功能,我也不得不承认lambda将为Swing开发人员的Action侦听器添加新鲜的空气:

      JButton button = new JButton('Click');// NEW WAY:button.addActionListener( (e) -> {System.out.println('The button was clicked!');});// OLD WAY:button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println('The button was clicked using old fashion code!');}});
    • 谁/什么是SAM? SAM代表“单一抽象方法”,因此,为了开一些角,我们可以说SAM ==功能接口。 即使在初始规范中,也将仅具有一种抽象方法的抽象类也视为SAM类型,一些人也发现/猜测了原因。
    • 方法/构造函数引用

Lambda听起来很好听吗? 但是以某种方式对功能接口的需求在某种程度上受到了限制–这是否意味着我只能使用包含单个抽象方法的接口? 并非完全如此-JDK 8提供了一种别名机制,该机制允许从类或对象中“提取”方法。 这可以通过使用新添加的::运算符来完成。 它可以应用于类–用于提取静态方法,也可以应用于对象以提取方法。 相同的运算符也可以用于构造函数。

引用:

interface ConstructorReference{T constructor();
}interface  MethodReference {void anotherMethod(String input);
}public class ConstructorClass {String value;public ConstructorClass() {value = 'default';}public static void method(String input) {System.out.println(input);}public void nextMethod(String input) {// operations}public static void main(String... args) {// constructor referenceConstructorReferencereference = ConstructorClass::new;ConstructorClass cc = reference.constructor();// static method referenceMethodReference mr = cc::method;// object method referenceMethodReference mr2 = cc::nextMethod;System.out.println(cc.value);}
}
  • 接口中的默认方法

这意味着从版本8开始,java接口可以包含方法主体,因此简单地说,java将支持多重继承,而不会带来通常的麻烦。 同样,通过提供接口方法的默认实现,可以确保添加新方法不会在实现类中造成混乱。 JDK 8向java.util.Collection或java.util.Iterator之类的接口添加了默认方法,并通过此方法提供了一种机制,可以在实际需要的地方更好地使用lambda。

值得注意的接口添加:

java.util.stream.Streamablejava.util.stream.Stream

改善馆藏的互动

在我看来,lambda项目所带来的所有更改都是对该语言的极大补充,这将使其与当前的标准保持一致,并使它变得更简单,更精简,但这种更改可能会带来最大的生产力影响和最大的挑战。效果肯定是集合框架的改进。 不,没有Collection 2框架,我们现在仍然必须处理类型擦除,但是Java将做出另一个重要的转变:从外部迭代到内部迭代。 这样,它为开发人员提供了一种以优雅的方式筛选和聚合集合的机制,除此之外还可以提高效率。 通过提供将在内部执行的lambda表达式,可以充分利用多核处理器的能力。 让我们考虑以下情形:

一个。 考虑字符串列表,选择所有大写的字符串。 怎么写?
旧方法:

//.....List inputList = new LinkedList<>();List upper = new LinkedList<>();// add elementsfor (String currentValue : inputList) {if (currentValue != null && currentValue.matches("[A-Z0-9]*")) {upper.add(currentValue);}}System.out.println(upper);

//….. 新方法:

//.....inputList.stream().filter(x -> (x != null && x.matches('[A-Z0-9]*'))).into(upper);

b。 考虑您想将所有提取的字符更改为小写。 使用JDK8的方式如下所示:

// .....inputList.stream().filter(x -> (x != null && x.matches("[A-Z0-9]*"))).map(String::toLowerCase).into(upper);

C。 以及如何从所选集合中找出字符数

// .....  int sumX = inputList.stream().filter(x -> (x != null && x.matches("[A-Z0-9]*"))).map(String::length).reduce(0, Integer::sum);

使用的方法:

default Streamstream() // java.util.CollectionStreamfilter(Predicate predicate) // java.util.stream.StreamIntStream map(IntFunction mapper) //java.util.stream.Stream

d。 如果我想从集合中获取每个元素并打印出来该怎么办?

//OLD WAY:
for (String current : list) {System.out.println(current);
}//NEW WAY:list.forEach(x -> System.out.println(x));

除了提到的功能之外,JDK 8还有其他有趣的消息,但是出于简洁的原因,我将在这里停止。 有关它的更多信息,请参见JDK 8 Project lambda网站或JSR 337的网页。

总而言之,Java正在向前发展,我个人喜欢它的发展方向,另一个有趣的方面是库开发人员也开始采用JDK 8的时间点。 那肯定会很有趣。 感谢您的时间和耐心,祝您圣诞快乐。

资源资源

Brian Goetz资源文件夹:
http://cr.openjdk.java.net/~briangoetz/lambda

方法/构造方法参考:
http://doanduyhai.wordpress.com/2012/07/14/java-8-lambda-in-details-part-iii-method-and-constructor-referencing

参考: Java –我们的JCG合作伙伴 Olimpiu Pop在Java Advent Calendar博客上对JDK 8的远见。

翻译自: https://www.javacodegeeks.com/2012/12/java-far-sight-look-at-jdk-8.html

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

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

相关文章

python三大结构、顺序结构_Python学习笔记3——三大结构:顺序,分支,循环3

顺序自上而下&#xff0c;依次执行分支分支的基本语法if 条件表达式&#xff1a;语句1语句2语句3......条件表达式就是计算结果必须为布尔值的表达式表达式后面的冒号不能少注意if后面的出现的语句&#xff0c;如果属于if语句块&#xff0c;则必须同一个锁紧等级条件表达式结果…

网络布线和数据转换

T568A 白绿 绿 白橙 蓝 白蓝 橙 白棕 棕 T568B 白橙 橙 白绿 蓝 白蓝 绿 白棕 棕 同种设备用交叉线 不同设备用直通线相连 PC与路由器为同种设备 交换机自成一派 转载于:https://www.cnblogs.com/qingqing1/p/11166632.html

Java 9模块系统(拼图)@ LJC的HackTheTower

今天&#xff0c;我们花了半天时间参加了第一次HackTheTower活动。 伦敦的Java用户组&#xff08;aka LJC &#xff09;的成员应伦敦市的邀请&#xff0c;聚集在伦敦市SalesForceTower&#xff08;aka Heron Tower &#xff09;26楼。 Heather VanCura是Java社区流程的主席 马…

在命令行下对ntfs分区文件夹权限的设置

随着Windows XP/Server 2003的流行&#xff0c;越来越多的用户开始选择NTFS文件系统&#xff0c;NTFS的好处自然是大大增强了系统的安全性&#xff0c;在“安全”标签页下&#xff0c; 我们可以在这里为不同级别的用户设置相应的访问控制权限&#xff0c;包括完全控制、修改、读…

uglifyjs报错 webpack_webpack3里使用uglifyjs压缩js时打包报错的解决

环境&#xff1a;webpac<4的下&#xff0c;安装uglifyjs。cnpm install uglifyjs-webpack-plugin -D安装完毕后&#xff0c;去npm里查看uglifyjs的使用方法并添加到代码中&#xff1a;const UglifyJsPlugin require(uglifyjs-webpack-plugin)module.exports {//...optimiz…

描述一下JVM加载class文件的原理机制

Java中的所有类&#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类&#xff0c;而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候&#xff0c;我们几乎不需要关心类的加载&#xff0c;因为这些都是隐式装载的&#xff0c;除非我们有特殊的…

xtend怎么使用_使用Xtend构建Vaadin UI

xtend怎么使用今天&#xff0c;我决定向Xtend打个招呼。 我希望学习一些新的编程语言。 选择一个标准的清单并不多。 它必须是在JVM上运行的编程语言&#xff0c; 如果我不需要学习用于建筑应用的全新生态系统&#xff0c;那就太好了。 我检查了几个选项。 JVM的编程语言列表…

linux mysql 写shell_Linux—编写shell脚本操作数据库执行sql

修改数据库数据在升级应用时&#xff0c;我们常常会遇到升级数据库的问题&#xff0c;这就涉及到sql脚本的编写。一般我们会通过写sql脚本&#xff0c;然后将xxx.sql脚本放到数据库中进行source xxx.sql执行。本篇文章&#xff0c;我们可以通过写shell脚本来执行数据库操作。配…

DMN 1.1 XML:使用Drools 7.0从建模到自动化

我是一名自由顾问&#xff0c;但今天我是一名博士生。 本文的全球背景是企业架构&#xff08;EA&#xff09;&#xff0c;它需要对企业进行建模。 由于EA的一个方面是业务流程建模&#xff0c;所以我使用BPMN已有数年之久&#xff0c;但是这种表示方式并不十分适合表示决策标准…

mysql安装模块解释_MySQL的模块不能安装的解决方法_MySQL

我们最常用的 DBD::mysql 模块,我发现是难住很多人的地方.因为安装老是失败,下面我介绍一下解决方法,比如我使用 cpanm 安装,有时就出 /home/nue2501j/work/DBD-mysql-4.010/blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: DBIc_TRACE_LEVEL at /usr/lib/perl5/5.8.5/i…

nginx访问目录是没加/的重定向控制

static 模块提供了root与alias功能&#xff1b;发现目标是目录时&#xff1b;但URI末尾未加/时&#xff1b;会返回301重定向&#xff1b;重定向后会加/ 指令 Syntax: server_name_in_redirect on | off;# 控制返回那个域名 Default: server_name_in_redirect off; Context: ht…

oracle mysql 字段_Oracle和MySQL修改字段

一、修改字段名&#xff1a;Oracle&#xff1a;ALTER TABLE tableName RENAME COLUMN oldColumnName TO newColumnName;eg: ALTER TABLE web RENAME COLUMN wen_name TO web_name;MySQL&#xff1a;ALTER TABLE tableName CHANGE oldColumnName newColumnName newColumnDataTyp…

Kafka REST Proxy for MapR Streams入门

介绍 MapR生态系统软件包2.0&#xff08;MEP&#xff09;随附了一些与MapR流有关的新功能&#xff1a; MapR Streams的Kafka REST代理为MapR Streams和Kafka集群提供RESTful接口&#xff0c;以使用和生成消息并执行管理操作。 Kafka Connect for MapR Streams是一个实用程序&…

开张大吉

在Windows的天地中做了五年开发之后&#xff0c;又跑到了开源的Linux/Java世界遨游了五年&#xff0c;于最近半年&#xff0c;又重新回到M$阵营。这半年来&#xff0c;迫于项目进度的压力&#xff0c;较少与他人交流&#xff0c;项目中虽然采用了VS2003&#xff0c;但是运用的思…

mysql四种输入_mysql四种事务隔离级别

mysql事务并发问题ACID什么的就不啰嗦了。mysql多个事务并发的时候&#xff0c;可能会出现如下问题&#xff1a;1. 更新丢失即两个事务同时更新某一条数据&#xff0c;后执行的更新操作会覆盖先执行的更新操作&#xff0c;导致先执行的更新结果丢失。2. 脏读即一个事务会读到另…

apache hadoop_春天遇见Apache Hadoop

apache hadoopSpringSource 刚刚宣布了适用于Apache Hadoop的Spring的第一个GA版本 。 该项目的目的是简化基于Hadoop的应用程序的开发。 您可以下载该项目在这里 &#xff0c;并检查了Maven的文物在这里 。 Apache Hadoop的Spring诞生是为了解决Hadoop应用程序构建不良的问题…

sinacloud webpy mysql_Mysqldb和webpy的安装

1.首先安装mysqlsudo apt-get install mysql-server2.然后安装libmysqld-dev和libmysqlclient-dev&#xff0c;否则在安装Mysqldb的时候会报找不到mysql_config文件sudo apt-get install libmysqld-devsudo apt-get install libmysqlclient-dev修改site.cfg中的mysql_config的配…

消费者驱动的Pact和Spring Boot测试

最近&#xff0c;我的一位同事偶然发现了Pact.io &#xff0c;我们的当前应用程序已发展到50多种服务&#xff0c;并且我们开始出现一些集成测试失败和脆弱的开发/验收测试环境。 因此&#xff0c;我们决定研究尝试与此相关的方法。 我从阅读开始&#xff1a; https : //docs.…

python空格怎么加密_使用Python的RSA加密

如果您想使用python高效地编码RSA加密&#xff0c;我的github存储库肯定会理解和解释python中RSA的数学定义RSA密钥生成def keyGen(): Generate Keypair i_prandint(0,20)i_qrandint(0,20)# Instead of Asking the user for the prime Number which in case is not feasible,# …

MySQL中字符串函数详细介绍

MySQL字符串函数对于针对字符串位置的操作&#xff0c;第一个位置被标记为1。 ASCII(str)返回字符串str的 最左面字符的ASCII代码值。如果str是空字符串&#xff0c; 返回0。如果str是NULL&#xff0c;返回NULL。 mysql> select ASCII(2);-> 50mysql> select ASCII(2)…