如何使用流和Java 8将列表中的对象按属性分组到其他列表?

Cla*_* M. 5 lambda list java-8 java-stream

我想将包含time属性的对象列表分组为5分钟,最好使用流和收集器.

我在StackOverflow上找到的唯一可能的解决方案是计算我需要多少个间隔(子列表),将每个对象添加到这些列表中的每一个,并过滤掉那些不适合相应时间范围的对象,这不是一个很好的解决方案.

(您可以在此处找到Thread:如何在Java 8中按另一个元素的元素对List的元素进行分组)

我想到了类似的东西:

List<MyObject> list = new ArrayList<MyObject>();
.......
List<List<MyObject>> grouped = list.stream().collect(Collectors.groupingBy(obj -> obj.getTime() / intervalLength));
Run Code Online (Sandbox Code Playgroud)

这当然是最重要的工作.

我希望随着Java 8及其功能的使用越来越多,我们可以为这样的问题找到一个suting解决方案.

此致,Claas M.

编辑:最后,我使用了@Harsh Poddar的解决方案并将Map转换为列表列表使用

for(Map.Entry<Integer, List<MyObject>> entry:map.entrySet())
  list.add(entry.getValue());
Run Code Online (Sandbox Code Playgroud)

注意:之后必须对List进行排序.

Har*_*dar 4

这完全可以正常工作:

Map<Long,<List<MyObject>> grouped = ticks.stream().collect(Collectors.groupingBy(obj -> obj.getTime() / intervalLength));
Run Code Online (Sandbox Code Playgroud)

此方法将为您提供一个地图,然后您可以在该地图上调用 .values() 来获取列表的列表。第一个元素将包含 obj.getTime() 从 0 到 IntervalLength 的元素(前提是存在此类元素)。第二个将包含从intervalLength到intervalLength*2等等