看看 JDK 8 给我们带来什么 已翻译 100%

oschina 投递于 2013/01/07 08:13 (共 14 段, 翻译完成于 01-07)
阅读 44315
收藏 49
JDK
19
加载中

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

  • 开发效率
  • 性能
  • 模块化
缪斯的情人
翻译于 2013/01/07 09:29
4

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

缪斯的情人
翻译于 2013/01/07 09:38
2

开发效率

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

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

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

缪斯的情人
翻译于 2013/01/07 09:51
1

性能

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

 

缪斯的情人
翻译于 2013/01/07 10:01
1

模块化

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

loki_lan
翻译于 2013/01/07 11:23
1

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

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

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

缪斯的情人
翻译于 2013/01/07 10:07
2

Lambdas

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

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

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

调整到合适的心态

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

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

下面是一个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.Comparable
  java.lang.Runnable
  java.util.concurrent.Callable
  java.awt.event.ActionListener

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

旧方式:

   new Thread(new Runnable() {
            @Override
            public 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相关的功能,但是我还是可以断定:lambdas肯定会给那些Swing开发者带去很多的便利。

动作监听:

  JButton button = new JButton("Click");

  // NEW WAY:
  button.addActionListener( (e) -> {
      System.out.println("The button was clicked!");
  });

  // OLD WAY:
  button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("The button was clicked using old fashion code!");
            }
        });

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

方法/构造方法 引用

 

wadyme
翻译于 2013/01/07 18:50
3
lambdas表达式听起来不错?但是不知为何功能接口带有一定的限制性- 那是否意味着我只能用包含单个抽象方法的接口呢?不见得——JDK8提供了一个别名机制,允许类或者对象的方法“调用”。用一个新增的操作符::可以做到。他可以应用到静态方法或者对象方法的调用。同样也可以应用于构造函数。
缪斯的情人
翻译于 2013/01/07 11:59
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(38)

5
5米想安静
多继承是好特性。但这个 lambdas 感觉让代码可读性变差了。
杨某某
杨某某
雅蠛蝶!!
h
hqnjkkl

很不错啊!新的语法

散关清渭
散关清渭
看着有点儿不伦不类 java开始学习scala了?
levinliu
levinliu
还是转JavaScript吧。
jnh
jnh
翻译的不错,我看完了。
codeLance
codeLance
项目里头还是JDK1.3的飘过。 看到了“接口包含方法体”和“多继承”,怎么我心里有些隐隐作痛啊~~
I
Irony
多继承,这不是要废掉java吧。。。
南湖船老大
南湖船老大
语法改变还算满意
Ethan-
Ethan-
信息不错
返回顶部
顶部