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 Roadmap 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/370029.shtml

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

相关文章

CSS 学习路线(一)元素

元素(element) 类型:替换和非替换元素 替换元素(replaced element): 用来替换元素内容的部分并非由文档内容直接显示. eg:img input 非替换元素(nonreplaced element): 其内容由用户代理在元素本身生成的框显示. eg:绝大多数都是非替换元素 基本元素类型:块级(block-lev…

[urllib]urlretrieve在python3

python3下面要使用&#xff1a;urllib.request.urlretrieve()这种形式的调用 1 from urllib.request import urlretrieve 2 3 4 urlretrieve(url, path) 转载于:https://www.cnblogs.com/sigai/p/8178375.html

使用Gulp压缩CSS/JS

一、安装 1.安装gulp npm install -g gulp2.检查gulp 版本 gulp -v3.在项目文件夹下安装gulp npm install --save-dev gulp二、压缩JS 1.安装gulp-uglify模块 npm install gulp-uglify2.在项目根目录创建gulpfile.js文件 3.在gulpfile.js文件中写入代码 // 获取 gulpvar gulp …

android活动开始,android – 点击谷歌地图标记infoWindow开始活动

我建议使用HashMap或类似的东西.当您遍历对象列表并为它们创建标记时,还要将标记添加到列表中,使用对象的ID作为键,将标记作为值&#xff1a;private HashMap markerMap new HashMap();…for(MarkerObject obj : this.markerObjects){//If the marker isnt already being disp…

Hamcrest包含匹配器

与Hamcrest 1.2相比 &#xff0c;针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档。 例如&#xff0c;四个重载的contains方法具有更具描述性的Javadoc文档&#xff0c;如下面所示的两个比较屏幕快照所示。 尽管仅通过尝试就可以弄清楚“包含”匹配器…

华为cor—al10_cor al10是华为什么型号 cor al10是华为啥型号

cor al10是华为荣耀Play。外观方面&#xff0c;荣耀Play提供有星云紫&#xff0c;极光蓝&#xff0c;幻夜黑三种基础配色&#xff0c;以及幻夜黑与魅焰红的酷玩版配色&#xff1b;拍照方面&#xff0c;荣耀Play具有1600万AI双摄像头&#xff0c;前置摄像头为1600万像素&#xf…

函数 (四) 迭代器和生成器

一 迭代器 一 迭代的概念 #迭代器即迭代的工具&#xff0c;那什么是迭代呢&#xff1f;#迭代是一个重复的过程&#xff0c;每次重复即一次迭代&#xff0c;并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复&#xff0c;因而不是迭代print(>) l[1,2,3]…

进阶-JMS 知识梳理

JMS 一、 概述与介绍 ActiveMQ 是Apache出品&#xff0c;最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。提供客户端支持跨语言和协议&#xff0c;带有易于在充分支持JMS 1.1和1.4使用J2EE企业集成模式…

android蓝牙pair,Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了

原标题&#xff1a;Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了 来源&#xff1a;cnBeta.COM蓝牙是一项应用非常广泛的无线技术&#xff0c;在无线音频配件、智能手表和智能家电中都广泛使用。不过蓝牙设备的配对体验并不优秀&#xff0c;而且无法实现跨平台的一致性…

用CSS让DIV上下左右居中的方法

例如 一个父div(w:100%;h:400px)中有一个子div(w:100px;100px;)。让其上下左右居中。 方法一&#xff08;varticle-align&#xff09; 理念 利用表格单元格的居中属性。 步骤 父div外层配置一个div&#xff0c;同时设置为表格元素 (display: table)&#xff0c;宽度为100%父…

功能性Java集合

如今&#xff0c;在功能上大肆宣传&#xff0c;因此至少在Java集合方面&#xff0c;我将简要介绍一下其中的功能。 我个人喜欢标准 集合API&#xff0c;但在某些情况下可能会很尴尬并添加其他详细信息。 在Java 8的更高版本中&#xff0c;这应该不是问题。 在那里&#xff0c;…

python绘制帕累托图

python绘制帕累托图代码 1 import pandas as pd2 import matplotlib.pyplot as plt3 plt.rcParams[font.sans-serif][SimHei]#表示可以显示中文4 plt.rcParams[axes.unicode_minus]False#表示可以正常显示正负号5 datapd.read_csv(catering_dish_profit.csv,index_coltype)6 pr…

currentStyle、getComputedStyle 获取样式

style.height 获取的是行间的样式 currentStyle.height、getComputedStyle(elem,null).height 获取的是 div 的 content 的宽高&#xff0c; clientHeight 获取的是 contentpadding&#xff0c; offsetHeight 获取的是contentpaddingborder。 <script> window.onload…

html5 测评游戏,暗黑之王评测:HTML5游戏铸就最华丽ARPG冒险

由白鹭时代(Egret Technology)与比悦科技联手推出的重度大型HTML5游戏《暗黑之王》&#xff0c;一款典型的ARPG手游&#xff0c;其HTML5版本推出以来&#xff0c;获得了来自业界、玩家和媒体的大量关注。其丰富的游戏内容和玩法&#xff0c;加上卓越的游戏性能表现&#xff0c;…

搞定flex布局

这几种方式的搭配使用可以轻松搞定 PC 端页面的常见需求&#xff0c;比如实现水平居中可以使用 margin: 0 auto&#xff0c;实现水平垂直同时居中可以如下设置&#xff1a;.dad {position: relative; } .son {position: absolute;margin: auto;top: 0;right: 0;bottom: 0;left…

Java基础5一数组的常见应用算法

常用算法 1.冒泡排序: 原理&#xff1a;比较两个相邻的元素&#xff0c;将值大的元素交换至右端 示例: public static void bubbleSort(int[] a) {int n a.length;//总共进行n-1轮的比较for (int i 1; i < n; i) {for (int j 0; j < n - i; j) {if (a[j] > a[j 1]…

使用Xtend构建Vaadin UI

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

python 浏览器显示本地文件夹_浏览器读取本地文件

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存储NAS是一个可共享访问&#xf…

p15页

给你一个n*n的01矩阵&#xff0c;只能够将0变成1&#xff0c;使得每个元素上下左右之和均是偶数&#xff0c; 比如 0 0 0 0 1 0 1 0 0>>>>1 0 1 0 0 0 0 1 0 一个转变了3步 多实例T 然后一个n&#xff08;n<15&#xff09; 表示n*n的矩阵 …

html 登陆sql server,jsp实现注册与登录页面+sqlsever2008

//index.jspString path request.getContextPath();String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/";%>登陆用户登陆用户名&#xff1a;密 码:注册新用户//Logon.jspString path req…