我有一个对象流,我想通过以下方式收集这些对象。
假设我们正在处理论坛帖子:
class Post {
private Date time;
private Data data
}
我想创建一个按句点对帖子 进行分组的列表。如果没有关于 X
的帖子分钟,创建一个新组。
class PostsGroup{
List<Post> posts = new ArrayList<> ();
}
我想要一个List<PostGroups>
包含按时间间隔分组的帖子。
示例: 10
的区间分钟。
帖子:
[{time:x, data:{}}, {time:x + 3, data:{}} , {time:x + 12, data:{}, {time:x + 45, data:{}}}]
我想获取帖子组的列表:
[
{posts : [{time:x, data:{}}, {time:x + 3, data:{}}, {time:x + 12, data:{}]]},
{posts : [{time:x + 45, data:{}]}
]
- 注意第一个组一直持续到
X + 22
.然后在X + 45
收到了一个新帖子 .
这可能吗?
最佳答案
使用 groupRuns
可以很容易地解决这个问题。我的方法StreamEx图书馆:
long MAX_INTERVAL = TimeUnit.MINUTES.toMillis(10);
StreamEx.of(posts)
.groupRuns((p1, p2) -> p2.time.getTime() - p1.time.getTime() <= MAX_INTERVAL)
.map(PostsGroup::new)
.toList();
我假设你有一个构造函数
class PostsGroup {
private List<Post> posts;
public PostsGroup(List<Post> posts) {
this.posts = posts;
}
}
StreamEx.groupRuns
方法接受一个应用于两个相邻输入元素的 BiPredicate
,如果它们必须组合在一起则返回 true。此方法创建列表流,其中每个列表代表组。这种方法是惰性的,并且可以很好地处理并行流。
关于java - 使用 Java 8 的复杂自定义收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34417261/