-1

我为 java 8 流实现了一个收集器,当达到给定阈值时,它将实体存储到存储库中。

public BiConsumer<Tuple2<Integer,List<T>>, T> accumulator() {
    return (tuple, e) -> {
        List<T> list = tuple._2;
        list.add(e);
        if (list.size() >= this.threshold) {
            this.repository.save(list);
            this.repository.flush();
            list = new LinkedList<>();
        }
        tuple = new Tuple2<>(tuple._1 + 1, list);
    };
}

这不能按预期工作。元素 e 被添加到列表中,但在达到阈值后不会重置。Integer 也保持在 0,这是可以预期的,因为它是最终成员。看来我唯一的选择是使我的 Tuple2 可变并清空 List :-( 任何建议如何使用不可变元组解决这个问题?

4

1 回答 1

1

lambda 表达式可以被认为是一个没有名称的函数(或方法)。在这个例子中,它就像一个方法,有两个形式参数tuplee并且在它的主体中还有一些局部变量,包括list.

当您对形式参数或局部变量进行赋值时,该赋值对于当前方法(或 lambda 主体)是局部的。累加器返回后,外部不会看到任何突变或副作用,因此这些分配不会影响您正在收集的数据结构。

我不完全确定您要做什么,但是您可以尝试编写一个包含整数计数器(或其他) 和一个列表。累加器将添加到列表中,有条件地刷新和替换列表,并增加计数器。这些可变操作在收集器中是允许的,因为收集器框架仔细地对这些操作进行了线程限制,因此您正在改变的对象不需要是线程安全的。

于 2014-09-30T06:50:59.187 回答