java - 使用 Java 8 的复杂自定义收集器

标签 java java-8 java-stream collectors

我有一个对象流,我想通过以下方式收集这些对象。

假设我们正在处理论坛帖子:

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/

相关文章:

java - 删除月份 SimpleDateFormat 中的前导 "0"

java - 包装在不可变对象(immutable对象)内的可变对象安全吗?

java - Stream.map 未转换为流的 Stream

java - 流分组后如何聚合分组实体

java - 如何从 Kotlin 中的 java 类型数组获取 javaclass?

multithreading - 具有CompletableFutures的异步非阻塞任务

java.text.Collat​​or 将 "v"和 "w"视为瑞典语/区域设置的相同字母

针对 JDK8 构建时,Java 应用程序 CPU/负载更高

java - 流 :Collect with supplier and accumulator

Java - 如何在特定列表项上运行函数