分离器中的action.accept(val)做什么

时间:2019-05-05 14:50:18

标签: java spliterator

我不知道action.accept(val)是做什么的,已经进行了搜索,我知道必须这样做,只是不知道为什么。
这是一个我不明白的简单例子:

public class CachedSpliterator <T> extends Spliterators.AbstractSpliterator 
{
    Spliterator<T> spliterator;
    int index;
    ArrayList<T> cache;

public CachedSpliterator(Spliterator<T> spliterator, ArrayList<T> cache) {
    super(spliterator.characteristics(), 0);
    this.spliterator=spliterator;
    index=0;
    this.cache=cache;
}

public boolean tryAdvance(Consumer action){         
    if(index<cache.size()){ 
        action.accept(cache.get(index));       
        index++;                                
        return true;                            
    }
    else{
        return spliterator.tryAdvance(val->{    

            cache.add(val);
            index++;                            
            action.accept(val);
        });
    }
}

因此,例如,在这段代码中,我了解到我们有一个使用者,该使用者消耗源中的每个元素(在本例中为分隔符),并且每个元素都必须由操作接受。 所以在我看来,动作是cache.add(val)和变量index的增量,我根本不明白为什么最后一行(action.accept(val))必须写出来。谢谢。

1 个答案:

答案 0 :(得分:0)

action是用户定义的函数,用于对数据执行,并且对于CachedSpliterator的用户而言。增量并添加到缓存是该类内部逻辑的一部分。
例如:

CachedSpliterator spliterator = new CachedSpliterator(...);
spliterator.tryAdvance(item -> {
    // Will execute this code on every item from the source
    // Can perform any logic here, like save to a database
    db.save(item);   
});