你应该使用.flatMap()
方法从主列表contactsList
中每个Contact
对象所包含的sharedFriendsIds
列表中创建一个单一的列表。请检查;
List<String> sharedContacts = contactsList.stream()
.map(Contact::getSharedFriendsIds)
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.sorted().collect(Collectors.toList());
.filter()
调用是为了处理列表中任何 Contact
的 sharedFriendsIds == null
的情况,因为这会导致下一行出现 NPE
,我们应该过滤掉这些。还有其他方法可以实现这个目的,比如:
- Optional
List<String> sharedContacts = contactsList.stream()
.flatMap(contacts -> Optional.ofNullable(contacts.getSharedFriendsIds())
.map(Collection::stream).orElseGet(Stream::empty))
.sorted().collect(Collectors.toList());
Where the filtering of null `sharedFriendsIds` are done in such a way that
they are absorbed into the `flatMap` logic as empty streams.
- emptyIfNull()
您可以从apache.commons
导入集合依赖项,并使用以下方式调用CollectionUtils.emptyIfNull
方法:
public static <T> Stream<T> collectionAsStream(Collection<T> collection) {
return emptyIfNull(collection).stream();
}
然后从原始流中调用它,如下所示:
List<String> sharedContacts = contactsList.stream()
.map(Contact::getSharedFriendsIds)
.flatMap(Foo::collectionAsStream)
.sorted().collect(Collectors.toList());
我想你在排序逻辑中使用了 .sequential
,我猜你应该使用 .sorted
方法,因为 sequential 是用于触发非并行使用的,而这已经是 Stream
的默认配置。
.sequential()
? - Tagir Valeev