所有示例代码打包下载 : 点击打开链接

Java8新特性 :

  1. 接口新增默认方法和静态方法
  2. Optional类
  3. Lambda表达式
  4. 方法引用
  5. Stream API - 函数式操作流元素集合
  6. Date/Time API
  7. 新API和工具
  8. Nashorn , JavaScript引擎

7 . 新API和工具

7.1 重复注解

Java8之前 , 注解在同一位置只能声明一次 . 在Java8中 , 允许同一个位置声明多次注解 .

重复注解机制本身必须用@Repetable注解 , 事实上 , 这并不是语言层面上的改变 , 更多的是编译器的技巧 , 底层的原理保持不变

package com.xbz.java8.newApi;
import java.lang.annotation.*;
public class RepeatingAnnotationDemo {@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Filters {Filter[] value();}
​@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Repeatable(Filters.class)public @interface Filter {String value();}@Filter("filter1")@Filter("filter2")interface Filterable {}
​public static void main(String[] args) {for (Filter filter : Filterable.class.getAnnotationsByType(Filter.class)) {System.out.println(filter.value());}}
}

正如我们看到的,这里有个使用@Repeatable( Filters.class )注解的注解类Filter,Filters仅仅是Filter注解的数组,但Java编译器并不想让程序员意识到Filters的存在。这样,接口Filterable就拥有了两次Filter(并没有提到Filter)注解。

同时,反射相关的API提供了新的函数getAnnotationsByType()来返回重复注解的类型(请注意Filterable.class.getAnnotation( Filters.class )经编译器处理后将会返回Filters的实例)。

7.2 Base64

Base64在java8中转正了,不需要再使用sun.misc.BASE64Encoder和sun.misc.BASE64Decoder了, 而是java.util.Base64,这是一个工厂类,它用来创建两个内部实现类,即Base64 编码的编码器和解码器。
    Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:

  • 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
  • URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
  • MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用'\r'并跟随'\n'作为分割。编码输出最后没有行分割。
序号 方法 描述
1 static Base64.Decoder getDecoder() 返回一个 Base64.Decoder ,解码使用基本型 base64 编码方案。
2 static Base64.Encoder getEncoder() 返回一个 Base64.Encoder ,编码使用基本型 base64 编码方案。
3 static Base64.Decoder getMimeDecoder() 返回一个 Base64.Decoder ,解码使用 MIME 型 base64 编码方案。
4 static Base64.Encoder getMimeEncoder() 返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案。
5 static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator) 返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案,可以通过参数指定每行的长度及行的分隔符。
6 static Base64.Decoder getUrlDecoder() 返回一个 Base64.Decoder ,解码使用 URL 和文件名安全型 base64 编码方案。
7 static Base64.Encoder getUrlEncoder() 返回一个 Base64.Encoder ,编码使用 URL 和文件名安全型 base64 编码方案。
        Base64.Encoder encoder = Base64.getEncoder();String str = "abcd";String enc = encoder.encodeToString(str.getBytes());System.out.println(enc);
​System.out.println(new String(Base64.getDecoder().decode(enc)));
7.3 try/catch 异常捕获的改变

新的try/catch可以自动关闭在try表达式中打开的对象 , 而无需开发者手动关闭 ,即不用再写finally了

try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("p1.obj"))) {System.out.println(TryCatchDemo.class.hashCode());TryCatchDemo demo = (TryCatchDemo) in.readObject();System.out.println(demo.getClass().getName());} catch (Exception e) {e.printStackTrace();}//自动关闭in对象 , 无需再写finally{in.close();}
7.4 并行(parallel)数组

Java 8增加了大量的新方法来对数组进行并行处理。可以说,最重要的是parallelSort()方法,因为它可以在多核机器上极大提高数组排序的速度 
实例:并行初始化一个20000的数组,并且填充1000000内的随机数,然后并行排序

package com.xbz.java8.newApi;
​
import java.time.Duration;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;
​
public class ParallelArraysDemo {public static void main(String[] args) {LocalTime begin = LocalTime.now();long[] arrayOfLong = new long[20000];
​Arrays.parallelSetAll(arrayOfLong, index -> ThreadLocalRandom.current().nextInt(1000000));Arrays.stream(arrayOfLong).limit(10).forEach(i -> System.out.print(i + " "));System.out.println();
​Arrays.parallelSort(arrayOfLong);Arrays.stream(arrayOfLong).limit(10).forEach(i -> System.out.print(i + " "));System.out.println();System.out.println(Duration.between(begin, LocalTime.now()));}
}
7.5 拓宽注解的应用场景

Java 8拓宽了注解的应用场景。现在,注解几乎可以使用在任何元素上:局部变量、接口类型、超类和接口实现类,甚至可以用在函数的异常定义上。下面是一些例子:

package com.xbz.java8.newApi;
​
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collection;
​
public class AnnotationsDemo {@Retention( RetentionPolicy.RUNTIME )@Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )public @interface NonEmpty {        }
​public static class Holder< @NonEmpty T > extends @NonEmpty Object {public void method() throws @NonEmpty Exception {            }}
​@SuppressWarnings( "unused" )public static void main(String[] args) {final Holder< String > holder = new @NonEmpty Holder< String >();        @NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>();        }
}
7.6 参数名称

为了在运行时获得Java程序中方法的参数名称,老一辈的Java程序员必须使用不同方法,例如Paranamer liberary。Java 8终于将这个特性规范化,在语言层面(使用反射API和Parameter.getName()方法)和字节码层面(使用新的javac编译器以及-parameters参数)提供支持。

    Method method = ParameterNameDemo.class.getMethod("main", String[].class);for (final Parameter parameter : method.getParameters()) {System.out.println("Parameter: " + parameter.getName());}

在Java 8中这个特性是默认关闭的,因此如果不带-parameters参数编译上述代码并运行,则会输出如下结果:Parameter: arg0

如果带-parameters参数,则会输出如下结果(正确的结果):Parameter: args

7.7 其他

除此之外 , 还有并发(Concurrency), CAS原子类增强:LongAddr , JVM堆内存分布的优化 , metaspace的改变 , CompletableFuture以及多个CompletableFuture组合:thenCombine等 , 可深入了解

Java8新特性总结 -7.新API和工具相关推荐

  1. JDK1.8新特性及常用新特性

    JDK1.8的新特性 *Lambda表达式 新的日期API--Date time 引入Optional--防止空指针异常 *接口的默认方法和静态方法 *新增方法引用格式 *新增Stream类 注解相关 ...

  2. VS 2022新特性_Visual Studio2022新功能

    一.VS 2022新特性_Visual Studio2022新功能 Visual Studio 2022 正式版来了.默认支持.Net 6; 默认支持C# 10. 下载地址: https://visu ...

  3. Java8新特性总结 -5.Stream API函数式操作流元素集合

    所有示例代码打包下载 : 点击打开链接 Java8新特性 : 接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/T ...

  4. Java8新特性【函数式编程API、新时间日期处理API、Optional容器类】总结

    文章目录 1.Lambda表达式 1.1什么是Lambda表达式 1.2从匿名类到 Lambda 的转换 1.3Lambda表达式语法 2.函数式接口 2.1什么是函数式接口 2.2自定义函数式接口 ...

  5. Java8新特性——Map的新方法

    今天是高考的日子,是大四师兄师姐答辩毕业的日子.一代又来,一代又去.好久没写博客,借此特殊日子整理一下前不久学java8新特性时写的代码,留下痕迹.(本博客的代码根据 java8新特性教程 学习整理, ...

  6. jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式

    1.单例设计模式 1.概念: 设计模式:使用固有的流程或方式设计出来的类接口.枚举等元素 2.设计原则: 1.私有化构造方法[private.protected] 2.类中创建最终对象[唯一不能被赋值 ...

  7. ES6简介、新特性、Babel编译器、babel-cli工具、babel-polyfill工具(安装和使用)

    目录 简介 ECMAScript 的历史 ES6新特性 1.语法方面 2.功能方面 ​ Babel编译器 babel-cli工具 第一步:创建一个文件夹,名称为app,在vscode中打开终端,终端路 ...

  8. 玩转iOS开发:iOS 11 新特性《UIKit新特性的基本认识》

    文章分享至我的个人技术博客: https://cainluo.github.io/15099354591154.html 前两篇, 我们讲了Xcode 9的一些新特性, 可以更加方便我们去写" ...

  9. ES6-Promise简介、ES7 新特性及ES8新特性-async和await

    目录 ES6-Promise Promise简介 Promise.prototype.then方法 Promise.prototype.catch方法 ES7 新特性 Array.prototype. ...

最新文章

  1. linux的mysql服务器密码忘了,怎么解决?
  2. TCPIP / 粘包和拆包的定义以及解决办法
  3. STM32F10x_StdPeriph_Lib_V3.5.0库与系统滴答定时器(Systick)
  4. [HAOI2007]理想的正方形
  5. jboss drools_JBoss Drools –入门
  6. Qt生成的exe中为什么会带有不该有的盾牌?
  7. QT5开发及实例学习之十七Qt5双缓冲机制
  8. C++ const型成员函数与 non-const型成员函数 (二)
  9. HCIE-RS面试--RSTP为什么优于STP
  10. faster RCNN 与 fast RCNN 一分钟回忆图
  11. java程序实验总结_Java实验报告一及作业总结二
  12. 【GD32F303开发之开发工具的安装与配置】
  13. 如何导出久其报表所有数据_久其报表软件基本操作流程..docx
  14. 国家官宣!硕士补贴30W、本科补贴20W!一线城市户口,最高5W生活补贴丨毕业去这些城市,太太太爽了!...
  15. 暴躁兔让Web3与Crypto之路不再迷茫
  16. 机房教学管理系统/机房管理系统
  17. (原創) 一個關於C語言字串有趣的小題目 (C/C++) (C)
  18. C# .NET实现扫描识别图片中的文字
  19. 抑制背景干扰的行人重识别方法
  20. rust货轮什么时候出现_庆余年海棠朵朵什么时候出现 庆余年海棠朵朵第几集出现...

热门文章

  1. [fzu 2273]判断两个三角形的位置关系
  2. 使用Task简化Silverlight调用Wcf
  3. Linq to SQL 语法记录....并发写事务
  4. 实现等待wx.login完成后在执行其他请求
  5. CSS3 矢量图标及背景精灵
  6. 关于A+B+C问题4种语言的解决办法,Java、C语言、C++、Python
  7. CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
  8. 机器学习实战13-卷积神经网络
  9. PTA7、 转换函数使用 (10 分)
  10. mysql用any查询_mysql 5.6有ANY_VALUE功能吗?