`
greemranqq
  • 浏览: 971982 次
  • 性别: 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安装包下载(版本:jdk-8u321-macosx-x64)

    下载JDK-8u321-macosx-x64.dmg文件后,我们可以按照以下步骤进行安装: 1. **打开DMG文件**:双击下载的jdk-8u321-macosx-x64.dmg文件,这将打开一个新的磁盘映像窗口。 2. **安装JDK**:在磁盘映像窗口中,您会...

    jdk8资源包(含安装说明)

    在这个“jdk8资源包(含安装说明)”中,我们可以找到JDK8的安装程序以及可能的使用指南,帮助用户轻松地在自己的系统上安装和配置Java环境。 首先,JDK8的显著特性之一是Lambda表达式。Lambda表达式简化了函数式...

    JDK8的JVM内存结构,元空间替代永久代成为方法区及常量池的变化1

    这种方法区的调整是由于永久代存在的一些问题,比如大小设定困难,容易引发溢出,以及给垃圾收集器(GC)带来额外的复杂性,导致较低的回收效率。元空间位于直接内存(Direct Memory),这使得内存分配更加灵活,...

    jdk-8u121-windows-x64.rar

    首先,让我们来看看Java 8中的一些核心特性: 1. **lambda表达式**:这是Java 8最大的亮点之一。Lambda表达式使得函数式编程在Java中变得更加便捷,它允许开发者将功能作为方法参数,或者把代码看作数据。这种简洁...

    JDK1.8和JDK1.6API帮助文档

    JDK 1.8,又称为Java SE 8,于2014年发布,带来了重大的语言和API改进,其中包括: 1. **Lambda表达式**:这是Java 8最具标志性的特性,它引入了一种简洁的语法来表示匿名函数,大大简化了多路分支和并行编程。 2....

    jdk-8u66-linux-x64

    在"jdk-8u66-linux-x64"这个压缩包中,我们主要关注的是JDK 8的第66次更新,这是一个针对64位Linux操作系统的版本。64位系统能够处理更大的内存和更多的计算任务,因此对于大型应用或服务器环境是理想的选择。 1. *...

    jdk8源码(jdk-687fd7c7986d)

    《深入解析JDK8源码:探索lang、io、nio、util包的奥秘》 在Java编程领域,深入理解JDK源码是提升技术能力的重要途径。JDK8是Java发展过程中的一个重要里程碑,引入了许多创新特性,如Lambda表达式、Stream API以及...

    jdk-8u202-windows-x64.7z

    首先,我们来看“jdk-8u202-windows-x64.exe”这个文件,它是JDK 8u202的安装程序。在Windows操作系统上,.exe文件通常表示可执行程序。在这个特定的版本中,“x64”表示该JDK是为64位系统设计的,这意味着它可以...

    Oracle Java JDK 17

    首先,我们来看看JDK 17提供的主要组成部分: 1. **Java编译器(javac)**:这是将Java源代码转换为字节码的工具,字节码可以在任何支持Java的平台上运行。 2. **Java虚拟机(JVM)**:JVM是Java程序的执行环境,它...

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

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

    JDK1.8下载/JDK11下载/JDK14下载/JDK17下载各版本免积分下载

    JDK 1.8,也被称为Java 8,是Oracle公司于2014年3月发布的里程碑式版本。此版本引入了诸多新特性,如Lambda表达式,这使得函数式编程在Java中成为可能。此外,还增加了方法引用和新的日期/时间API,改进了Stream API...

    jdk1.8.rar

    首先,让我们来看看JDK 1.8中的关键特性: 1. **Lambda表达式**:这是JDK 1.8最重要的新特性之一,它引入了函数式编程的概念。Lambda表达式允许将匿名函数作为方法参数传递,使得代码更加简洁、可读性更强,尤其在...

    java jdk11(windows、linux和open JDK)

    首先,我们来看Windows平台的安装。`jdk-11.0.10_windows-x64_bin.exe`是专为Windows 64位系统设计的安装程序。运行此可执行文件,用户将被引导完成安装过程,包括选择安装路径、设置环境变量(如JAVA_HOME、PATH)...

    jdk-14_osx-x64_bin.tar.gz jdk-8u202-linux-x64.tar.gz

    首先,我们来看"jdk-8u202-linux-x64.tar.gz"。这是JDK 8更新202的64位版本,专为Linux操作系统设计。JDK 8是Java历史上的一个关键版本,引入了许多重要的特性,如Lambda表达式、Stream API、默认方法(在接口中)...

    JDK11 for Mac

    在探讨“JDK11 for Mac”这一主题时,我们主要关注的是Java开发工具包(JDK)的第11个版本如何适用于Mac操作系统。Java作为一种广泛使用的编程语言,在软件开发领域占据着重要地位,而JDK则是Java开发的基础工具集,...

    jdk1.4源代码

    首先,让我们来看看`sunw`目录。`sunw`是Sun Microsystems(Java的创建者)特定的包,包含了与Sun操作系统相关的类和接口。尽管这部分源代码可能不适用于所有平台,但它揭示了Java如何与操作系统进行低级别的交互,...

    JDK17,Java高版本JDK工具包

    首先,让我们来看看JDK17中的主要新特性: 1. **Sealed Classes**:这是一个重要的新特性,它允许程序员限制哪些类可以扩展或实现特定的类或接口。这增加了代码的封装性,提高了安全性,并有助于防止意外的继承行为...

    jdk11_官方版.rar

    首先,我们来看看`jdk-11_windows-x64_bin.exe`这个文件。这代表了适用于Windows 64位操作系统的JDK 11安装程序。在安装过程中,它会包含Java运行时环境(JRE)以及用于开发和调试Java应用程序的工具。安装JDK后,...

    20230904jdk1.8.0-77.zip

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

    jdk6 for mac

    在本例中,我们关注的是JDK 6的Mac版,这是一个较旧的版本,主要用于支持那些仍依赖于Java 6特性和API的项目。 Oracle自Java 7开始接管Sun Microsystems的Java开发,随后发布了多个版本,包括Java 8、9、10、11直至...

Global site tag (gtag.js) - Google Analytics