您应该用来
.flatMap()从
sharedFriendsIds包含在
Contact主列表中每个对象中的列表中创建一个列表
contactsList。请检查;
List<String> sharedContacts = contactsList.stream() .map(Contact::getSharedFriendsIds) .filter(Objects::nonNull) .flatMap(Collection::stream) .sorted().collect(Collectors.toList());
该
.filter()调用适用于列表中
Contact包含with 的情况
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方法,因为顺序是用于触发非并行使用的,这已经是的默认配置
Stream。



