首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用对象的属性作为键将List<Object>转换为Map<key,List<Object>>

使用对象的属性作为键将List<Object>转换为Map<key,List<Object>>
EN

Stack Overflow用户
提问于 2019-06-17 09:12:41
回答 2查看 110关注 0票数 0

我有一个带有以下元素的对象Foo:

代码语言:javascript
复制
class Foo {
    int id;
    int departmentId;
    boolean condition1;
    boolean condition2;
    boolean condition3;
    //...
}

和Foo对象列表(大约10k个条目):

代码语言:javascript
复制
List<Foo> fooList = new ArrayList<>();
fooList.add(...);
//...

我需要遍历这个列表中的每个departmentIds,并且一旦某个departmentId的对象满足特定的条件组合,就能够停止它的任何进一步的迭代。

为此,我想简单地创建一个新的映射,它将我的departmentId作为键,所有相关的Foo对象作为它的值。这样我就可以基于departmentId遍历我的新对象,并在满足条件后轻松地停止对具有相同Id的其他部门的迭代。类似于:

代码语言:javascript
复制
Map<Foo.departmentId, List<Foo>> departmentFoos = new HashMap<>();

除了遍历我的fooList并逐个放置/替换我的HashMap的对象之外,还有更好的方法来实现这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2019-06-17 09:26:43

因此,就迭代次数而言,转换为Map不太可能给您带来任何好处,您最好只是遍历列表并就地处理。这是必需的,因为在浏览完整个departmentId列表之前,无法知道您是否已经到达了特定Foo的最后一次出现。

所以我会这样做:

代码语言:javascript
复制
for (Foo foo : fooList) {
  if (hasBeenProcessed(foo.departmentId) {
    continue;
  }
  process(foo);
}

请注意,根据您的需要,hasBeenProcessed可以与processedDepartmentIds.contains(foo.departmentId)一样简单。

对于仅仅将其转换为地图,没有什么可以避免遍历整个列表。在像Guava: Maps.toMapGuava: Multimaps.index这样的库中有一些方便的方法来实现这一点。

票数 2
EN

Stack Overflow用户

发布于 2019-06-17 13:56:28

使用Streams,可以这样完成:

代码语言:javascript
复制
Map<Integer, List<Foo>> output = fooList.stream()
                .collect(Collectors.groupingBy(Foo::getDepartmentId, Collectors.toList()));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56623717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档