当前位置: 首页 > 面试题库 >

Java 8获取列表中的所有元素

范玄裳
2023-03-14
问题内容

我有一个对象列表,其中每个对象返回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中的所有项并打印每个项?

  • 问题内容: 是否有一种快速的方法可以从中的所有表获取所有列名,而不必列出所有表? 问题答案: