《写给大忙人看的java SE8》笔记 -- 3. 杂项改进与java7新特性

本文概述了Java 8的改进与新特性,包括时间日期API、并发增强、Lambda表达式、CompletableFuture、文件操作及增强的基础功能,强调了在Java开发中应用这些新特性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间和日期改进

  • 所有的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吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值