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

tsi*_*ngh 10 java java-8 java-stream

我有一个对象列表,其中每个对象返回List<String>.如何使用Java 8流只获取一个List<String>

Contact class有以下方法;

public List<String> getSharedFriendsIds() {
    return sharedFriendsIds;
}
Run Code Online (Sandbox Code Playgroud)

我有

List<Contact> contactsList;
Run Code Online (Sandbox Code Playgroud)

我在想的是

List<String> sharedContacts = contactsList.stream()
    .map(Contact::getSharedFriendsIds)
    .sequential()
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但上面的线不是返回 List<String>,而是 List<List<String>>我不想要的.

bur*_*ete 11

您应该使用从主列表中的每个对象中包含.flatMap()sharedFriendsIds列表创建单个Contact列表contactsList.请检查以下内容;

List<String> sharedContacts = contactsList.stream()
        .map(Contact::getSharedFriendsIds)
        .filter(Objects::nonNull)
        .flatMap(Collection::stream)
        .sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

.filter()调用适用Contact于列表中有任何联系的情况,因为这会导致下一行中的NPE,我们应该将其过滤掉.还有其他方法可以达到这个目的;

    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.
Run Code Online (Sandbox Code Playgroud)

对null的过滤sharedFriendsIds == null以这样的方式完成,即它们NPE作为空流被吸收到逻辑中.

你也用过Optional排序逻辑,我猜你应该使用emptyIfNull()方法,因为顺序用于触发非并行使用,这已经是默认的默认配置apache.commons.

  • 你两次调用`getSharedFriendsIds()`.在`.filter`步骤之前首先执行`.map(Contact :: getSharedFriendsIds)`可以很容易地避免这种情况.你甚至可以强制过滤和flatmap步骤,例如`.map(Contact :: getSharedFriendsIds).flatMap(list-> list!= null?list.stream():null)`,但这只是一个品味问题...... (3认同)
  • @tsingh最好让`getSharedFriendsIds()`返回一个空流而不是`null`. (2认同)

dmi*_*inn 5

这里没有理由使用.sequential(),默认情况下流是顺序的.

List<String> sharedContacts = contactsList.stream()
        .map(Contact::getSharedFriendsIds)
        .filter(Objects::nonNull)
        .flatMap(Collection::stream)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

按自然顺序;

List<String> sharedContacts = contactsList.stream()
        .map(Contact::getSharedFriendsIds)
        .filter(Objects::nonNull)
        .flatMap(Collection::stream)
        .sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)