JAVA app 获取界面元素,Java 8获取列表中的所有元素

I have a List of Objects where each object that returns List.

How can I use Java 8 streams to get only one List?

Contact class has the following method;

public List getSharedFriendsIds() {

return sharedFriendsIds;

}

And I have

List contactsList;

What I was trying was

List sharedContacts = contactsList.stream()

.map(Contact::getSharedFriendsIds)

.sequential()

.collect(Collectors.toList());

But above line is not returning List but rather List> which is not what I want.

解决方案

You should use .flatMap() to create a single list from the sharedFriendsIds list that is contained in each Contact object from the main list contactsList. Please check the following;

List sharedContacts = contactsList.stream()

.filter(contacts -> contacts.getSharedFriendsIds() != null)

.flatMap(contacts -> contacts.getSharedFriendsIds().stream())

.sorted().collect(Collectors.toList());

The .filter() call is for the case when there is any contact with sharedFriendsIds == null in the list, since that would cause NPE in the next line, we ought to filter those out. There are other ways to achieve that like;

List sharedContacts = contactsList.stream()

.flatMap(contacts -> Optional.ofNullable(contacts.getSharedFriendsIds())

.map(List::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.

Also you used .sequential for the sort logic, I guess, you should've used .sorted method, since sequential is for triggering non-parallel usage, which is already the default configuration of a default Stream.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值