zoukankan      html  css  js  c++  java
  • Java Language Changes for Java SE 9

    Java9引入了module模块的概念,是类与接口和数据资源的一种封装,并可以声明与其他模块的依赖关系。这里总结一下Java9带来的新特性。

    更简练的try-with-resources语句

      final Resource resource1 = new Resource("resource1");//a final resource
      Resource resource2 = new Resource("resource2");//An effectively final resource
      try(resource1;resource2){}//in Java7&8: try(Resource r1=resource1;Resources r2=resource2){}
      //@SafeVarargs可用于static、final、private方法,Iterator<String> i=new Iterator<>(){}钻石符号可用于匿名类,下划线不能再用于变量名
    集合工厂方法增强
      List.of(E e1, E e2, E e3); //有多个重载方法,老版本:Arrays.asList(“a”,”b”);Stream.of(“a”,”b”).collect(toList())
      Set.of(E … elements); //of工厂方法创建的都是unmodifiable不可更改的集合,可使用new ArrayList(unmodifiable)再次包装
      Map.of(K k1, V v1, K k2, V v2); //ofEntries(Map.Entry<K,V> … entries),Map.entry(“K”,”V”)可以提供entryies参数
      //内部实现使用了wrapper对象,原始集合还是可以更改但不建议,unmodifiable集合可用于并行计算,避免很多场合下的集合复制,多个重载方法是为更好性能
    进程ProcessHandle增强
      Process p=new ProcessBuilder(“notepad.exe”).start();//老版本:Runtime.getRuntime().exec(String),Process.waitFor()进程退出后才会执行后续代码
      ProcessHandle ph = Process.toHandle(); //long getPid()等方法直接代理给了ProcessHandle.getPid(),当前进程ProcessHandle.current()
      Info i=ProcessHandle.info(); //Info包含了进程命令信息,Optional<String[]> args=Info.arguments(); 命令:Info.command().orElse(“”)
      //onExit().thenAccept(ph –> System.out.println(“PID %d terminated%n”, ph.getPid())); 使用lamda响应进程退出信息,onExit().get()等待进程
    多版本三方包Multi-Release Jar
      META-INFO/MANIFEST.MF,包含条目 Multi-Release: true
      META-INFO/releases/9/A.class,在JDK9时可替代/A.class,JDK10则对应10目录
      //例如获取pid的不同方法,可提供多JDK支持的jar包,JarFile.isMultiRelease()
      //JDK8及以前:jvmName = ManagementFactory.getRuntimeMXBean().getName(); index = jvmName.indexOf('@'); pid=index<1?0:jvmName.substring(0, index);
      //JDK9及以后:ProcessHandle.current().getPid();
      jar cfe pid.jar PrintPID -C v1 PrintPID.class -C v1 Util.class --release 9 -C v2 Util.class //java –jar pid.jar,支持JDK8和JDK9
    调用栈访问StackWalker
      StackTraceElement[] stackTrace = new Throwable().getStackTrace(); //老的方式比较耗性能
      StackWalker sw2 = StackWalker.getInstance(); //options可选RETAIN_CLASS_REFERENCE、SHOW_HIDDEN_FRAMES
      sw.forEach(System.out::println); //Consumer<? super StackWalker.StackFrame> action,StackFrame支持fileName、methodName、lineNumber等信息
      long numFrames = sw.walk(frames_ -> frames_.count()); //forEach()等价于walk(s -> { s.forEach(action); return null; });
    发布订阅框架
      SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
      MySubscriber<String> subscriber = new MySubscriber<>(); //class MySubscriber<T> implements Subscriber<T>{void onSubscribe(Subscription subscription)}
      publisher.subscribe(subscriber); publisher.submit(“A”); publisher.close();



  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/xingqi/p/9959688.html
Copyright © 2011-2022 走看看