13426109659
info@21cto.com

你可能喜欢的Java 9到Java 13 API的改进

作者 Admin 分类 资讯 05月24日

人们一般倾向于使用经过多年测试的技术,因此很多人还在用Java7/8的代码写程序。在本篇文章中,我们介绍Java9的新功能,特别是一些有用的API。

在Java9中,有不同用来收集的工厂方法。现在有一些获取不用修改的集合。

1、对于List

List.of(E... elements)

2、对于Set

Set.of(E... elements)

3、对于 Map

Map.ofEntries(Entry... entries)

如今,可以像以前一样轻松处理不须修改的集合,以前像下面这样的代码构造:

List list = new ArrayList<>();
list.add("abc");
list.add("xyz");
Collections.unmodifiableList(list);

如今,可以一行完成:

List.of("abc","xyz");

同样,我们增加了程序中不可变List的籹量,还增加了更好的安全性。

ifPresentOrElse(Consumer action, Runnable emptyAction)

我尝试在每个可以获得空引用的地方都使用Optional类,可以避免多余的if-else语句。

Optional mail = ...
if (mail.isPresent()) {
    send(mail.get());
} else {
    reportError();
}

可以用更灵活的方式重写它:

opt.ifPresentOrElse(
    mail -> send(mail),
    () -> reportError());

还有更好的方法:

Optional or(Supplier> supplier) 

如果返回empty是可选的,可以生成一个新的可选类:

Optional optional = Optional.ofNullable("first")
.or(() -> Optional.of("second"));

可以通过Optional just-only调用方法生成一个Stream stream()。

Optional.of(obj).stream()

它比下面的代码要好得多:

Optional.of(obj).map(Stream::of).orElse(Stream.empty())

Stream接口同样又有了新方法。

default Stream  takeWhile(Predicate predicate)
default Stream dropWhile(Predicate predicate)

这些方法接受谓词,可以给出一些限制或跳过元素的逻辑,而不仅仅是元素数量。

方法的迭代也可以有谓词逻辑。可以编写一些逻辑来停止生成对象:

IntStream
    .iterate(1, i -> i < 16, i -> i + 1)
    .forEach(System.out::println); 

以代替以下代码:

IntStream
    .iterate(1, i -> i + 1)
    .takeWhile(i -> i < 16)
    .forEach(System.out::println);

在Java 16中出现了一个新方法 toList()。比如要执行一些转换,类似如下代码:

collection.stream()
    // operations
        .collect(Collectors.toList());

在Java 16中,可以通过新的Stream.toList()方法来实现:

collection.stream()
    // operations
        .toList();         

它为我们提供了更方便的代码,且性能更优化,比collect(Collectors.toList())更优。

在Java9中,Java.time包中为我们提供了更多方法,可以使用Duration来提高工作效率。

Duration dur = Duration.between(now().minusDays(10).minusSeconds(567), now());
System.out.println(dur.toDaysPart()); // 10
System.out.println(dur.toMinutesPart()); // 9

可以将时间进行划分:

Duration dur = Duration.of(3, ChronoUnit.HOURS);
Duration ans = dur.dividedBy(Duration.of(20, ChronoUnit.MINUTES));
System.out.println(ans); // 9

如果想将时间间隔划分为多个段时,这是一种快捷的方法。在LocalDate中,我们获得了新的方法dateUntil。

Stream dates = LocalDate.of(2021, 3, 3).datesUntil(LocalDate.of(2021, 10, 9));

此方法将返回两个日期间的日期流。

评论