jdk安装教程
随着Java功能流变得越来越流行,越来越多的请求要求支持新的流操作。 在这些要求大量不同的新操作的请求中, 一个似乎比其他请求更多请求的操作是直接从Stream提供List的操作。 JDK 16 Early Access Build 27引入了Stream.toList()
,它是本文的主题。
在JDK 16 Early Access Build 27引入Stream.toList()
,从Stream
获取List
的最常见方法是调用approprite Collector :
stream.collect(Collectors.toList())
这不是很多代码,而且一旦您看到它就相当简单,但是许多人都希望对这种经常使用的流操作使用更简洁的语法。 JDK 16为我们带来了这一点:
stream.toList()
进入自己的代码库并使用stream.toList()
替代stream.collect(Collectors.toList())
可能很诱人,但是如果代码具有直接或间接的行为可能会有所不同依赖于stream.collect(Collectors.toList())
返回ArrayList的实现。 stream.collect(Collectors.toList())
和stream.toList()
返回的List
之间的一些关键区别在本文的其余部分中进行了阐述。
基于Javadoc的Collectors.toList()的文档指出了(强调),“返回将输入元素累积到新List
中的Collector
。 还有的类型,可变性,串行化或线程安全的任何保证List
返回......”虽然有关于无保证‘型,可变性,串行化,或对线程安全’ List
提供Collectors.toList()
,预计一些可能已经意识到这是目前一个ArrayList
,并已在依赖于一个特点的方式使用它ArrayList
。
以下代码段(在GitHub上列出了完整的代码)显示了一种方法,可以对Collectors.toList()
和Stream.toList()
返回的List
实现执行该方法,以了解它们的共同点以及区别。
/**
* Analyzes the supplied {@code List} and writes to standard output
* some key characteristics of the supplied {@code List}.
*
* @param listDescription Description of {@code List} to be analyzed.
* @param listUnderAnalysis {@code List} to be analyzed.
*/
private static void analyzeList(
final String listDescription, final List<String> listUnderAnalysis)
{
out.println(listDescription + ": ");
out.println("\tClass Type: " + listUnderAnalysis.getClass().getCanonicalName());
out.println("\tAble to add to List? " + isListAddCapable(listUnderAnalysis));
out.println("\tAble to sort List? " + isListSortable(listUnderAnalysis));
}
当针对Stream.collect(Collectors.toList())
和Stream.toList()
返回的List
实现执行上面的简单分析代码时,输出如下所示。
Stream.collect(Collectors.toList()):
Class Type: java.util.ArrayList
Able to add to List? true
Able to sort List? true
Stream.toList():
Class Type: java.util.ImmutableCollections.ListN
Able to add to List? false
Able to sort List? false
[NOT Stream] List.of():
Class Type: java.util.ImmutableCollections.ListN
Able to add to List? false
Able to sort List? false
上面示出的输出表明Stream.toList()
提供了一个List
的实现,是不可变的(类型ImmutableCollections.ListN
类似于由提供了可以不被添加到或排序) List.of()和在对比的是可变的(可由Stream.collect(Collectors.toList())
提供的ArrayList
了更改和排序。 任何现有代码取决于对Stream.collect(Collectors.toList())
返回的ArrayList
进行突变的能力,都无法与Stream.toList()
并且将引发UnsupportedOperationException 。
尽管Stream.collect(Collectors.toList())
和Stream.toList()
返回的List
的实现本质非常不同,但是它们仍然都实现List接口,因此在使用List.equals(对象) 。 这在GitHub上的完整代码清单中得到了证明。
将方法toList()
到Stream接口虽然很小,但是确实使常用的技术更加方便。
翻译自: https://www.javacodegeeks.com/2020/12/jdk-16-stream-to-list-in-one-easy-call.html
jdk安装教程