我有一个对象列表,其中每个对象返回List<String>
。我如何使用Java 8流仅获得一个List<String>
?
Contact
类具有以下方法;
public List<String> getSharedFriendsIds() {
return sharedFriendsIds;
}
我有
List<Contact> contactsList;
我正在尝试的是
List<String> sharedContacts = contactsList.stream()
.map(Contact::getSharedFriendsIds)
.sequential()
.collect(Collectors.toList());
但是上面的行没有返回 List<String>
,而是 List<List<String>>
我不想要的。
您应该用来.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
。
问题内容: 获取Oracle中所有表的列表? 问题答案: 假设您有权访问DBA_TABLES数据字典视图。如果您没有这些特权但需要它们,则可以请求DBA显式授予您对该表的特权,或者请求DBA授予您该SELECT ANY DICTIONARY特权或SELECT_CATALOG_ROLE角色(这两者都将允许您查询任何数据字典表) )。当然,您可能希望排除某些模式,例如SYS和模式,SYSTEM而这些模
问题内容: 如果我有两个清单 什么是获取熊猫数据框的最优雅的方式,如下所示: 注意,第一列是索引。 问题答案: 使用于:
我有一个java流,其中我必须只对一些对象应用操作,但我希望得到具有相同元素数的流。例如 我有用户类。 我想增加50个现有余额为500或以上的用户的余额。在返回列表中,我还需要未修改余额的用户, 回报应该是 和原来的顺序一样,但是记录被修改了,这符合条件。任何想法我怎么能用流和功能方式做到这一点,没有如果,等等 我尝试了方法,但它只是将过滤后的值传递到下游。
使用Eclipse和Java-Version1.8 但这将只是打印stream对象,我如何能够访问stream中的所有项并打印每个项?
问题内容: 是否有一种快速的方法可以从中的所有表获取所有列名,而不必列出所有表? 问题答案: