我不知道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))必须写出来。谢谢。
答案 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);
});