人们一般倾向于使用经过多年测试的技术,因此很多人还在用Java7/8的代码写程序。在本篇文章中,我们介绍Java9的新功能,特别是一些有用的API。
在Java9中,有不同用来收集的工厂方法。现在有一些获取不用修改的集合。
1、对于List
List.of(E… elements)
2、对于Set
Set.of(E… elements)
3、对于 Map
Map.ofEntries(Entry extends K, ? extends V>… entries)
如今,可以像以前一样轻松处理不须修改的集合,以前像下面这样的代码构造:
List list = new ArrayList<>();
list.add("abc");
list.add("xyz");
Collections.unmodifiableList(list);
如今,可以一行完成:
List.of("abc","xyz");
同样,我们增加了程序中不可变List的籹量,还增加了更好的安全性。
ifPresentOrElse(Consumer super T> 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 extends Optional extends T>> 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 super T> predicate)
default Stream dropWhile(Predicate super T> 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));
此方法将返回两个日期间的日期流。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/258470.html