网上搜集的有关于java8的新特性(一)

2014-11-24 00:35:19 · 作者: · 浏览: 2

经过2年半的努力、屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本。

Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码;其次,新加入的Nashorn引擎也使得Java程序可以和java script代码互操作;再者,新的日期时间API、GC改进、并发改进也相当令人期待。

另外,原本要加入Java 8的Jigsaw项目(标准模块系统)由于开发时间关系,被推迟到了Java 9中,不过Java 8已经在朝着这个方向努力了。
Java 8的所有新特性及改进包括(JEP全称为JDK Enhancement Proposal,JDK改进建议):

语言改进:

  • JEP 126:Lambda表达式 & 虚拟扩展方法
  • JEP 138:基于Autoconf的构建系统
  • JEP 160:针对Method Handles的Lambda形式的表征
  • JEP 161:简洁的配置文件
  • JEP 162:为模块化做准备
  • JEP 164:利用CPU指令来改善AES加密的性能
  • JEP 174:Nashorn引擎,允许在Java程序中嵌入JS代码
  • JEP 176:自动检测识别Caller-Sensitive方法
  • JEP 179:JDK API变化和稳定性记录 VM基础改进:

    • JEP 142:减少指定字段上的缓存争用 VM垃圾回收(vm/gc)改进:

      • JEP 122:移除Permanent Generation(永久代)
      • JEP 173:移除一些很少使用的垃圾回收器组合 VM运行时(vm/rt)改进:

        • JEP 136:提供更多的验证错误信息
        • JEP 147:减少类元数据封装
        • JEP 148:支持创建小型虚拟机(3M以下)
        • JEP 171:添加3个内存有序化的内联函数 核心基础(core)改进:

          • JEP 153:命令行启动JavaFX应用 核心lang(core/lang)改进:

            • JEP 101:目标类型推断
            • JEP 104:Java类型注解
            • JEP 105:DocTree API
            • JEP 106:在javax.tools中添加Javadoc
            • JEP 117:移除APT(Annotation-Processing Tool)
            • JEP 118:运行过程中可访问参数名
            • JEP 120:重复注解
            • JEP 139:增强了javac,以改善构建速度
            • JEP 172:DocLint工具,用来检查Javadoc注释内容 核心库(core/libs)改进:

              • JEP 103:并行数组排序
              • JEP 107:集合数据批量操作
              • JEP 109:增强的包含Lambda的核心库
              • JEP 112:改进了字符集的实现
              • JEP 119:Core Reflection提供的javax.lang.model实现
              • JEP 135:Base64编解码
              • JEP 149:减少了核心库的内存占用
              • JEP 150:日期时间API
              • JEP 155:改进对并发的支持
              • JEP 170:JDBC 4.2
              • JEP 177:java.text.DecimalFormat.format优化
              • JEP 178:静态链接的JNI库
              • JEP 180:使用平衡树处理频繁的HashMap碰撞 核心i18n(core/i18n)改进:

                • JEP 127:改进了本地数据封装,采用Unicode CLDR数据
                • JEP 128:BCP 47局部匹配
                • JEP 133:Unicode 6.2 核心net(core/net)改进:

                  • JEP 184:HTTP URL访问权限 核心安全(core/sec)改进:

                    • JEP 113:MS-SFU Kerberos 5扩展
                    • JEP 114:TLS Server Name Indication(SNI)扩展
                    • JEP 115:AEAD密码套件
                    • JEP 121:更强的口令加密系统算法
                    • JEP 123:可配置的安全随机数生成方法
                    • JEP 124:增强了证书撤回检测API
                    • JEP 129:NSA Suite B加密算法实现
                    • JEP 130:SHA-224消息摘要算法实现
                    • JEP 131:针对64位Windows的SunPKCS11加密提供程序
                    • JEP 140:特权限制
                    • JEP 166:彻底检修JKS-JCEKS-PKCS12密钥库 web/jaxp改进:

                      • JEP 185:JAXP 1.5(限制获取外部资源)

                        Java8带有Lambda表达式的预览版的JDK已经放出来了(地址在最下面),新特性有以下四个:

                        1.Lambda表达式(或称之为“闭包”或者“匿名函数”)

                        2.扩展的目标类型

                        3.方法和构造器引用

                        4.接口默认方法

                        本文先介绍一下很值得期待的Lambda表达式,lambda表达式,等同于大多说动态语言中常见的闭包、匿名函数的概念。其实这个概念并不是多么新鲜的技术,在C语言中的概念类似于一个函数指针,这个指针可以作为一个参数传递到另外一个函数中。


                        由于Java是相对较为面向对象的语言,一个Java对象中可以包含属性和方法(函数),方法(函数)不能孤立于对象单独存在。这样就产生了一个问题,有时候需要把一个方法(函数)作为参数传到另外一个方法中的时候(比如回调功能),就需要创建一个包含这个方法的接口,传递的时候传递这个接口的实现类,一般是用匿名内部类的方式来。如下面代码,首先创建一个Runnable的接口,在构造Thread时,创建一个Runnable的匿名内部类作为参数:

                        Java代码
                        1. new Thread(new Runnable() {
                        2. public void run() {
                        3. System.out.println("hello");
                        4. }
                        5. }).start();

                          类似这种情况的还有swing中button等控件的监听器,如下面代码所示,创建该接口的一个匿名内部类实例作为参数传递到button的addActionListener方法中。

                          Java代码
                          1. public interface ActionListener {
                          2. void actionPerformed(ActionEvent e);
                          3. }
                          4. button.addActionListener(new ActionListener() {
                          5. public void actionPerformed(ActionEvent e) {
                          6. ui.dazzle(e.getModifiers());
                          7. }
                          8. });

                            这样的代码的缺点是有代码笨重,可读性差,不能引用外面的非final的变量等。lambda表达式就是为了解决这类问题而诞生的。

                            在介绍Java8中的Lambda表达式之前,首先介绍一个概念叫“函数式接口”(functional interfaces)。对于任意一个Java接口,如果接口中只定义了唯一一个方法,那么这个接口就称之为“函数式接口”。比如JDK中的ActionListener、Runnable、Comparator等接口。

                            先来看一下Java8中的lambda表达式的使用示例:

                            创建一个线程:

                            Java代码
                            1. new Thread(() -> {System.out.println("hello");}).start();

                              可以看到这段代码比上面创建线程的代码精简了很多,也有很好的可读性。

                              () -> {System.out.println("hello");} 就是传说中的lambda表达式,等同于上面的new Runnable(), lambda大体分为3部分:

                              1.最前面的部分是一对括号,里面是