Что делает action.accept (val) в spliterator - PullRequest
0 голосов
/ 05 мая 2019

Я не понимаю, что делает 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)). Спасибо.

1 Ответ

0 голосов
/ 05 мая 2019

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);   
});
...