写点什么

Java9 新特性 - 下篇

用户头像
hepingfly
关注
发布于: 2020 年 11 月 04 日
Java9 新特性 - 下篇

1、try 语句结构升级


在 Java9 中可以在 try 子句中使用已经初始化过的资源。

public class Java9Try {
/** * Java7 中关于异常,我们需要手动去处理,去关闭 * @author hepingfly * @date 2020/10/24 4:09 下午 */ public void testJava7() { InputStream is = null; try { is = new FileInputStream(new File("a.txt")); System.out.println("hepingfly"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != is) { is.close(); } } catch (IOException e) { e.printStackTrace(); } } }
public void testJava8() { /** * 在 try 后面的小括号中声明的一些资源,它会自动的关闭,就不需要你手动的去关了 * 在 Java8 中要求资源对象的实例化,必须放在 try 后面的小括号内 */ try (InputStream is = new FileInputStream(new File("a.txt"))) { System.out.println("hepingfly"); } catch (Exception e) { e.printStackTrace(); } }
public void testJava9() { /** * 可以在 try 后面的小括号中调用已经实例化好的资源对象 * 多个资源对象以分号分隔 */ InputStreamReader is = new InputStreamReader(System.in); OutputStreamWriter os = new OutputStreamWriter(System.out); try (is;os) { System.out.println(is.read()); } catch (Exception e) { e.printStackTrace(); } }}
复制代码


2、下划线命名标识符的限制

public class Java9Underline {    public static void main(String[] args) {        // _str 可以编译通过        String _str = "hello";        // 单独一个 _ 作为变量名,无法编译通过        String _ = "hello";    }}
复制代码


3、String 底层存储结构的变化

JDK8 之前,底层使用 char[] 存储,JDK9 底层使用 byte[] 存储。


4、创建只读集合

1)、Java8 创建只读集合方式

public static void testJava8() {    // 创建一个只读的 list    List<String> list = Collections.unmodifiableList(Arrays.asList("heping","fly"));    list.forEach(System.out::println);    // 创建一个只读的 set    Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("heping","fly")));    set.forEach(System.out::println);    // 创建一个只读的 map    Map<Object, Object> map = Collections.unmodifiableMap(new HashMap<>() {        {            put("name", "hepingfly");            put("age", "18");        }    });    map.forEach((x,y) -> System.out.println(x + ":" + y));}
复制代码


2)、Java9 创建只读集合方式

public static void testJava9() {    // 创建一个只读的 list    List<String> list = List.of("heping", "fly");    // 创建一个只读的 set    Set<String> set = Set.of("heping", "fly");    // 创建一个只读的 map    Map<String, String> map = Map.of("name", "heping", "age", "18");    Map<String, String> map2 = Map.ofEntries(Map.entry("name", "heping"), Map.entry("age", "12"));}
复制代码


5、StreamAPI 增强

在 Java9 中,Stream API 变的更好,Stream 接口中添加了 4 个新的方法,dropWhiletakeWhileofNullable 、 还有个 iterator 方法的新重载方法。


除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 stream() 将一个 Optional 对象转换为一个(可能是空的)Stream 对象。


① takeWhile

用于从 Stream 中获取一部分数据,接收一个 predicate 来进行选择。在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素。

/**  * takeWhile 方法 */public static void test1() {    List<Integer> list = Arrays.asList(13,11,45,18,20,16,96);    Stream<Integer> stream = list.stream();    /**         * 下面这行代码的意思就是:         * 当满足 x < 20 这个条件的时候我就 take(取)         * ① 13 小于 20 满足,我进行 take 然后输出         * ② 11 小于 20 满足,我进行 take 然后输出         * ③ 45 不小于 20 ,那么就停止,即使后面有小于 20 的数,我到这也停止了,后面的就不输出了         */    stream.takeWhile((x) -> x < 20).forEach(System.out::println);}
复制代码


② dropWhile


dropWhile 的行为与 takeWhile 相反,返回剩余的元素。


public static void test2() {    List<Integer> list = Arrays.asList(13,11,45,18,20,16,96);    Stream<Integer> stream = list.stream();    /**         * 下面这行代码的意思就是:         * 当满足 x < 20 这个条件的时候我就 drop(丢)         * ① 13 小于 20 满足,我进行 drop 丢掉         * ② 11 小于 20 满足,我进行 drop 丢掉         * ③ 45 不小于 20 ,那么就停止,后面所有的数我都不进行 drop 了,即使有小于 20 的数         */    stream.dropWhile((x) -> x < 20).forEach(System.out::println);}
复制代码


③ ofNullable 的使用


Java8 中 Stream 不能完全为 Null ,否则会报空指针异常。而 Java9 中的 ofNullable 方法允许我们创建一个单元素 Stream ,可以包含一个非空元素,也可以创建一个空 Stream 。


public static void test3() {    Stream<Integer> stream = Stream.of(1, 2, 3, null);    stream.forEach(System.out::println);
// 如果只有单个元素,此元素不能为 null,否则报空指针异常 Stream<Object> stream1 = Stream.of(null);
// Java9 新增 ofNullable 允许单个元素为空 Stream<Object> stream2 = Stream.ofNullable(null); System.out.println(stream2.count()); // 0}
复制代码


④ iterate 函数重载

public static void test4() {    // 需要通过 limit 来控制终止    Stream.iterate(0, x -> x + 1).limit(10).forEach(System.out::println);
// 这里就可以通过传入一个断言型函数来进行终止 Stream.iterate(0, x -> x < 10, x -> x + 1).forEach(System.out::println);}
复制代码


6、Optional 提供的 Stream 方法


public static void test1() {    List<String> list = Arrays.asList("a","b","c");    Optional<List<String>> optional = Optional.ofNullable(list);    // optional 类中提供了转换为 stream 的方法    Stream<List<String>> stream = optional.stream();    stream.forEach(System.out::println);}
复制代码


发布于: 2020 年 11 月 04 日阅读数: 39
用户头像

hepingfly

关注

视频号:hepingfly 分享干货,欢迎关注~ 2018.06.23 加入

B站程序员。目标是做一个有才华,身上有光的男人。

评论

发布
暂无评论
Java9 新特性 - 下篇