`
greemranqq
  • 浏览: 966301 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

[转]看看 JDK 8 给我们带来什么

阅读更多

世界正在缓慢而稳步的改变。这次改变给我们带来了一个新模样的JDK7,java社区也在一直期盼着在JDK8,也许是JDK9中出现一些其他的改进。JDK8的改进目标是填补JDK7实现中的一些空白——部分计划蓝图将被实现,在2013年里,从三个特殊方面提升和优化这门语言:

  • 开发效率
  • 性能
  • 模块化
缪斯的情人
缪斯的情人
翻译于 8天前

2人顶

 

 翻译的不错哦!

其它翻译版本(1)

因此,从明年开始,java会通过在各个平台运行的方式(手机,云端,桌面,服务器等)来作为优化改进的一种方式。接下来,我将把2013年我们所期待的做一个概述——恰好该做新年年度计划——之后,我们将把重点放在提高开发效率的lambda项目上,以及在编写代码中如何将lambda表达式引进。

缪斯的情人
缪斯的情人
翻译于 8天前

1人顶

 

 翻译的不错哦!

开发效率

生产效率方面JDK8主要从以下2个目标提升:

-集合(collections)- 通过对集合扩展,让使用时更加简洁

-注解(annotations)- 加强注解支持,允许在上下文中写注解,现在是不能这样用的(如:primitives)

缪斯的情人
缪斯的情人
翻译于 8天前

0人顶

 

 翻译的不错哦!

性能

把Fork/Join框架加到JDK7中,是我们转向多核编程的第一步。JDK8通过提供闭包(lambda表达式)支持的方式将这条路线走的更远了。可能影响较大的就是集合部分吧,闭包再加上新的接口和功能将推使java容器到一个新的层次。除了更加增加可读性和代码的简洁性,lambda表达式还使集合操作能充分利用多核处理器特性。

 

缪斯的情人
缪斯的情人
翻译于 8天前

0人顶

 

 翻译的不错哦!

模块化

社区中最让人感兴趣的一块是 jigsaw 项目:这个项目的目的是为JAVA SE平台设计和实现一个标准模块化的系统,然后把这个系统应用到平台本身和JDK。这里我用了过去式的说法是为了那些我们希望摆脱类路径(环境变量)和类载入器,我们不得不把期待留到JAVA9,至于那个时间点,也会因为 jigsaw 项目而推迟。

铂金小猫
铂金小猫
翻译于 8天前

0人顶

 

 翻译的不错哦!

我们来看一下2013年java的里程碑:

2013/01/31 M6 功能完成
2013/02/21 M7 开发者预览版本
2013/07/05 M8 最终候选版本
2013/09/09 GA 通用版

除了jigsaw 项目,另外一个让我们兴奋的大变动(在这个版本)将要到来,那就是闭包的支持!在lambda表达式的帮助下,jdk将有了关键性的提升。

缪斯的情人
缪斯的情人
翻译于 8天前

1人顶

 

 翻译的不错哦!

Lambdas

首先,我们需要下载个支持lambda的jdk,有两种方式可以获取到:

* 一个用于敢于尝试的人:从sources 源码自己构建
* 快捷版:直接下载编译好的sdk

缪斯的情人
缪斯的情人
翻译于 8天前

0人顶

 

 翻译的不错哦!

最初,我使用源码构建,但由于时间原因,再加上和环境变量有关的一些警告,我选择了偷懒的方法:使用已经构建好的jdk。另外一个重要的工具,是文本编辑器用它来写代码。在以前,jdk刚发布后一段时间,一个支持的IDE才产生。但这次不同了,也可能由于openjdk提供的透明和应用广泛的jdk有关。几天前,JetBrain第一个支持java8的IDE发布了。因此,IntelliJ IDEA 12成了第一个支持JDK8的IDE,除此之外的改进呢?处于测试目的,我在win7 x64机器上安装了支持jdk8 b68的IntelliJ 12社区版本。那些喜欢Netbeans的开发者,可以猛戳此处 download下载对lambda支持的包。
缪斯的情人
缪斯的情人
翻译于 8天前

0人顶

 

 翻译的不错哦!

调整到合适的心态

想要尝试运用最新的特性编写出更加高效和整洁的代码,你必须了解一下几个新的概念--好吧,至少鄙人需要。什么是lambda表达式?

最简单的看待lambda表达式的方式就是,你可以把它看做一个方法:”它提供一系列的正式的参数和一个通过这些参数来表述逻辑的方法体---它可以是一个表达式或者一个代码段。lambda表达式的参数可以是声名的或者引用的,当这些参数是引用类型的时候,那么这些类型就是源于针对lambda表达式的功能性接口。从返回值来看,一个lambda表达式可以是无返回值的--它们不返回任何结果,或者是有返回值的--在表达式里面的某个执行语句返回一个值。

下面是一个lambda表达式的例子:

01 (a) (int a, int b) -> a + b
02  
03 (b) (int a, int b) -> {
04  if (a > b) {
05      return a;
06  else if (a == b) {
07      return a * b;
08  else {
09      return b;
10  }
11 }

什么是功能性接口呢?一个功能性接口就是一个只含有抽象方法的接口,只是声名了一个函数。在某些场合下,这个唯一的函数可能是一个带有重载因子的的多态函数,这种情况下,所有的函数对外都是一个函数。除了典型的通过新建和初始化一个类来新建一个接口实例,功能性接口实例还可以通过使用一个lambda表达式、方法、或者构造引用来达到新建实例的效果。下面是一个功能性接口的例子:

1 // custom built functional interface
2 public interface FuncInterface {
3    public void invoke(String s1, String s2);
4 }

下面是来自java api的功能性接口:

1 java.lang.Comparable
2  java.lang.Runnable
3  java.util.concurrent.Callable
4  java.awt.event.ActionListener

接下来让我们来看看一个线程的启动在future中可能会发生怎么的变化:

旧方式:

1 new Thread(new Runnable() {
2          @Override
3          public void run() {
4              for (int i=0; i< 9; i++) {
5                  System.out.println(String.format("Message #%d from inside the thread!", i));
6              }
7          }
8      }).start();


新方式:

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

即使我还没有写过与java swing,AWT相关的功能,但是我还是可以断定:lambdas肯定会给那些Swing开发者带去很多的便利。

动作监听:

01 JButton button = new JButton("Click");
02  
03 // NEW WAY:
04 button.addActionListener( (e) -> {
05     System.out.println("The button was clicked!");
06 });
07  
08 // OLD WAY:
09 button.addActionListener(new ActionListener() {
10           @Override
11           public void actionPerformed(ActionEvent e) {
12               System.out.println("The button was clicked using old fashion code!");
13           }
14       });

什么是SAM?SAM 是单个抽象方法的替代,因此,直接一点,我们可以说SAM==功能性接口。即使在最初的规范里面,只有一个抽象方法的抽象类被认为是SAM类型的,很多人还是发现/猜出了这样定义的原因。

方法/构造方法 引用

 

wadyme
wadyme
翻译于 8天前

2人顶

 

 翻译的不错哦!

lambdas表达式听起来不错?但是不知为何功能接口带有一定的限制性- 那是否意味着我只能用包含单个抽象方法的接口呢?不见得——JDK8提供了一个别名机制,允许类或者对象的方法“调用”。用一个新增的操作符::可以做到。他可以应用到静态方法或者对象方法的调用。同样也可以应用于构造函数。
缪斯的情人
缪斯的情人
翻译于 8天前

0人顶

 

 翻译的不错哦!

参考代码:

01 interface ConstructorReference {
02     T constructor();
03 }
04  
05 interface  MethodReference {
06     void anotherMethod(String input);
07 }
08  
09 public class ConstructorClass {
10     String value;
11  
12     public ConstructorClass() {
13         value = "default";
14     }
15  
16     public static void method(String input) {
17         System.out.println(input);
18     }
19  
20     public void nextMethod(String input) {
21         // operations
22     }
23  
24     public static void main(String... args) {
25         // constructor reference
26         ConstructorReference reference = ConstructorClass::new;
27         ConstructorClass cc = reference.constructor();
28  
29         // static method reference
30         MethodReference mr = cc::method;
31  
32         // object method reference
33         MethodReference mr2 = cc::nextMethod;
34  
35         System.out.println(cc.value);
36     }
37 }

在接口中的默认方法

这意味着从版本8,JAVA接口可以含有方法体,所以为了使其简单,JAVA将支持多重继承,摆脱了以前比如头痛的问题。并且,通过为接口方法提供默认的实现,可以保证确保添加一个亲的方法不会在实现类中制造混乱。JDK8已经加入了默认方法到接口中如:java.util.Collection 和 java.util.Iterator,并且通过这个功能,可以提供一个机制去更好地在我们真的需要时使用lambdas。

已经加入的主要接口了:

1 java.util.stream.Streamable
2 java.util.stream.Stream
铂金小猫
铂金小猫
翻译于 8天前

0人顶

 

 翻译的不错哦!

改进了集合的互动

在我看来,所有lambda工程的改变都是对语言的极大补充,这将会使本语言与当前标准对齐,使其更简单、更简洁,但是这些改变可能使得本语言有最大的效率影响和最大的酷+哇效应,进而使集合框架将会有彻底的改造。但是,这没有集合2框架的概念,我们现在依然必须去做类型探险处理,但是JAVA将有其他重要方面的改变:从外部到内部的迭代。如此,它提供开发者的机制去过滤和用一个优雅的方式去聚合集合,除此之外,还提高了效率。通过提供lambda表达式,将会在内部被执行,这样,就可以充分利用多核处理器的功能了。

铂金小猫
铂金小猫
翻译于 8天前

0人顶

 

 翻译的不错哦!

让我们考虑以下场景:

a.假如有一个字符串列表,选择该列表的所有对象然后转换成大写字母。这该如何写呢?

旧方法如下:

01 //.....
02  
03  List inputList = new LinkedList<>();
04  List upper = new LinkedList<>();
05  
06  // add elements
07  
08  for (String currentValue : inputList) {
09    if (currentValue != null && currentValue.matches("*")) {
10        upper.add(currentValue);
11    }
12  }
13  
14  System.out.println(upper);
新方法:
1 //.....
2  inputList.stream().filter(x -> (x != null && x.matches("[A-Z0-9]*"))).into(upper);
b.假如你想要把所有提取的字符转换成小写字母。用JDK8的方法做将会像如下这样做:
1 / .....
2   inputList.stream().filter(x -> (x != null&& x.matches("[A-Z0-9]*"))).map(String::toLowerCase).into(upper);
c. 如何从选定的集合中找出 字符  数量:

 

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

 

1 default Stream stream() // java.util.Collection
2  Stream filter(Predicate predicate) // java.util.stream.Stream
3  IntStream map(IntFunction mapper) //java.util.stream.Stream
d.如果要从集合中取出每个元素然后打印,该怎样做呢? 

 

1 //旧方法:
2 for (String current : list) {
3   System.out.println(current);
4 }
5  
6  //新方法:
7  list.forEach(x -> System.out.println(x));
除了以上提到的功能外,JDK8还有其他有趣的新功能,但为了简洁篇幅,在此不做介绍。更多关于JDK8的信息可以在JDK8 [a href="http://jdk8.java.net/lambda/"]的lambda项目或者   JSR 337网页上得到。 
铂金小猫
铂金小猫
翻译于 8天前

0人顶

 

 翻译的不错哦!

总而言之,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

 

感谢:http://www.oschina.net/translate/far-sight-look-at-jdk8

分享到:
评论

相关推荐

    jdk-8u66安装包

    JDK 8免费版是款革命性开发平台,其全面升级现有Java编程模式,带来一项协同开发的JVM、Java语言以及库。 JDK的最重要命令行工具: 1、ja: 启动JVM执行class 2、jac: 编译器 3、jar: 打包工具 4、jadoc: ...

    JDK的安装过程希望能给大家带来帮忙

    该视频详细讲述了JDK的安装过程!看这个视频需要下载atrecply.msl这个安装视频

    Ubuntu 安装 JDK8 的两种方法(总结)

    下面小编就为大家带来一篇Ubuntu 安装 JDK8 的两种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    20230904jdk1.8.0-77.zip

    jdk1.8.0_77是Sun公司针对Java开发员的...所以JDK是一个开发环境,用于构建应用程序,applet程序,和使用java编程语言的组成部分,需要的小伙伴快来下载体验吧,小编给大家带来了完整的教程,跟着小编一起来看看吧。

    jdk 11 安装包 win 64 exe

    ,因为根据《2022 年Java生态系统状况报告》来看,目前市场比较主流的JDK版本还是JDK8以及JDK11。 由于JDK8已经在市场稳居很长一段时间了 ,一起来探究关于JDK11带来的新特性吧,请注意在使用时需要在集成开发环境中...

    javaJDK+eclipse开发环境搭建指导

    网上资源太多,看了许久终于自己整明白了,本次软件版本为2012年截至到目前的最新版本,希望能给大家带来帮助

    linux下查看已经安装的jdk 并卸载jdk的方法(推荐)

    下面小编就为大家带来一篇linux下查看已经安装的jdk 并卸载jdk的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    JDK 1.8API 中文版,方便不懂英文的汉化使用

    JDK发布新版本后,汉化的API要推迟很久才会出来,这对一些英语稍微差的同事来说非常不方便,我通过网络搜集,希望该资源能给大家工作带来便利!

    Linux下JDK中文字体乱码的解决方法

    下面小编就为大家带来一篇Linux下JDK中文字体乱码的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    linux下配置jdk环境变量的三种方法总结

    下面小编就为大家带来一篇linux下配置jdk环境变量的三种方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    解决调试JDK源码时,不能查看变量的值问题

    下面小编就为大家带来一篇解决调试JDK源码时,不能查看变量的值问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法

    下面小编就为大家带来一篇linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    解决maven update project 后项目jdk变成1.5的问题

    下面小编就为大家带来一篇解决maven update project 后项目jdk变成1.5的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起 小编过来看看吧

    window系统安装jdk jre的教程图解

    java开发少不了安装jdk,jdk可以同时安装多个版本,只要在项目部署时注意切换版本选择,下面小编给大家带来了window系统安装jdk jre的教程图解,感兴趣的朋友一起看看吧

    Java JDK 二分法 分析demo(推荐)

    下面小编就为大家带来一篇Java JDK 二分法 分析demo(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java并发编程原理与实战

    使用jdk8提供的lambda进行并行计算.mp4 了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程安全的原理(理论层面).mp4 synchronized保证...

    java并发编程

    | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk8提供的lambda进行并行计算00:14:22分钟 | 第11节了解多线程所带来的安全风险00:13:16分钟 | 第12节从线程的优先级看饥饿问题00:18:42分钟...

    Java中BigDecimal的基本运算(详解)

    下面小编就为大家带来一篇Java中BigDecimal的基本运算(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    sesvc.exe 阿萨德

    看看分别是什么意思? 初始化桶大小,因为底层是数组,所以这是数组默认的大小。 桶最大值。 默认的负载因子(0.75) table 真正存放数据的数组。 Map 存放数量的大小。 桶大小,可在初始化时显式指定。 负载因子,...

    龙果 java并发编程原理实战

    第10节使用jdk8提供的lambda进行并行计算00:14:22分钟 | 第11节了解多线程所带来的安全风险00:13:16分钟 | 第12节从线程的优先级看饥饿问题00:18:42分钟 | 第13节从Java字节码的角度看线程安全性问题00:25:43分钟...

Global site tag (gtag.js) - Google Analytics