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.
这里没有理由使用.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)