0

我不明白 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) 和变量索引的增量,我不明白为什么最后一行 (action.accept(val)) 必须写。谢谢你。

4

1 回答 1

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);   
});
于 2019-05-05T18:56:20.970 回答