《写给大忙人看的java SE8》笔记 -- 3. 杂项改进与java7新特性
2015-08-01 22:02
597 查看
时间和日期改进
所有的java.time对象都是不可变的Instant是时间线上的一个点;Duration是两个Instant之间的时间差;Period类似Duration,考虑到了夏令时,适用于带时区的时间
无闰秒,每天都是86400秒
LocalDateTime没有时区信息,ZonedDateTime是时区中的一个时间点
DateTimeFormatter用来格式化
TemporalAdjuster可以处理复杂的日期计算,比如找到某个月的第一个星期二
并发增强
通过lambda表达式,以前的非原子操作现在变得简单了,比如要更新一个AtomicLong对象为最大值,以前的代码为:do { oldValue = largest.get(); newValue = Math.max(oldValue, observed); } while(!largest.compareAndSet(oldValue, newValue));
新的代码可以写成
largest.updateAndGet(x -> Math.max(x, observed))
LongAdder和LongAccumulator内部使用了多个变量记录数值,加起来便得到总和,在激烈竞争的条件下,比AtomicLong效率更高。
CompletableFuture类似于Optional对象,可以通过lambda表达式指定后续操作,返回一个新的CompletableFuture对象。
其他
Objects类添加了静态函数isNull和nonNull,可以用在Stream。String提供了join函数。
数字类添加了sum, max, min等方法,可与与Stream配合使用。Byte.toUnsignedInt(b)可以得到无符号数字。Math类添加了addExact等方法,会在越界时抛出异常。
Comparator接口添加了新的方法,可以将多个比较器组合起来。并且添加了nullFirst和nullLast静态方法。
Files.lines和BufferedReader都会生成一个Stream,往往需要配合try-with-resources语法确保流的关闭:
try(Stream<String> lines = Files.lines(path)) { ... }。Files.walk可以递归遍历目录。
正式添加了Base64类。
注解类可重复,并且可被应用于类型。
正则表达式可以命名捕获组,添加了splitAsStream和asPredicate等方法。
值得注意的java7特性
异常处理
try(Resource res = ...) { 使用res }Resource类必须实现AutoCloseable接口,会被自动关闭。也可以使用多个资源
try(Resource1 res1 = ...; Resource2 res2=...) {}
使用过程中如果发生了异常,并且close时又发生了异常,则原来的异常会被抛出,close的异常被标记为suppressed。可以通过ex.getSuppressed()取得被压制的异常。
捕获多个异常catch(FileNotFoundException | UnknownHostException ex),ex到底是什么类型呢?书里没说。
文件操作
Path类与File类似,但是可以由多段组成。Files类提供了读写文件的便利方法,可以创建文件和目录,可以复制、移动和删除文件。增强的基础功能
Objects.equals(a, b)会在a和b都为null时返回true。
Objects.hash(a, b)会自动将多个对象的hashCode组合起来。Integer添加了compare(a,b)静态方法,不用担心溢出。
钻石操作符
可在构造函数里自动进行泛型推导,如List primes = new ArrayList<>(); Map<String, List> employeeRecords = new HashMap<>();
其它
Integer.paseInt("+1")不会再报错,在此之前整数前面有加号会报错。全局Logger:Logger.getGlobal()。
Objects.requireNonNull(a)可以用于null检查,抛出NullPointerException。
ProcessBuilder可以将输入输出重定向到文件,也可以通过inheritIO继承java的标准输出输出。
Java 8?还记得那年大明湖畔的Java 7吗?
相关文章推荐
- [LeetCode][Java] Candy
- 开发 IDE 从 Eclipse 转移到 IntelliJ Idea 中
- JAVA如何获得数据库的字段及字段类型
- A Scala Tutorial for Java programmers之(一)Scala入门:Scala例子,以及如何与Java交互
- 对于jdk jre jvm的简单认识
- java线程创建的两个方法
- 一些javaer博客
- 23. Navigator javaEnabled() 方法
- Java程序设计之裴波拉切那数列(兔子一年的数量)
- [LeetCode][Java] Gas Station
- java中的异常处理
- JAVA基础一大堆0801接口+匿名类+IO流
- java培训 2015-07-31
- Java学习之路:不走弯路,就是捷径
- Java反射机制
- 余弦相似度-java代码实现
- Ubuntu Eclipse CDT 使用math数学函数库:对×××未定义的引用
- Struts2中操作JSON
- struts2注解实现页面的跳转
- myeclipse 方法上加上@Override就报错