Существует ли концепция программирования Additive/Supplemental ForEach?

Мой вопрос содержит 2 подвопроса, поэтому он не ограничивается java, а учитывает парадигмы программирования в целом.

Мне нужен цикл, который выполняет обычный forEach, но также предоставляет для каждого индекса его предыдущие запуски. Позвольте мне уточнить.

Давайте определим:

ОБЪЕКТЫ = набор X, где X — любой тип объекта/данных.

PREV = результаты предыдущих итераций в виде коллекции Y, где Y является результатом одной итерации X< /сильный>

что бы сделал "мой" supplementalForEach:

OBJECTS.supplementalForEach((PREV, OBJ) -> doStuff(PREV, OBJ))

или как не потоковый вариант

var PREV = new ArrayList<>();
for(var OBJ : OBJECTS) {
    var result = doStuff(PREV, OBJ);
    PREV.add(result);
}

Таким образом, по сути, в Java это будет forEach, взяв BiFunction‹R, T› вместо Consumer‹T›

Теперь вопрос в том, существует ли уже концепция программирования для этой идеи? Если да, то как он называется? И если да, есть ли реализация Java?

Если нет, я могу просто реализовать это сам, но это мой любопытный вопрос. Кстати, я еще ничего не нашел в Google и Stackoverflow.

EDIT2: на данный момент я реализовал эти методы, не стесняйтесь использовать их по своему усмотрению (сохраняйте комментарии и ссылки)

/**
 * @author levent.dag
 * https://stackoverflow.com/users/9648047/levent-dag
 * 
 * naming idea with "akuzminykh"
 * https://stackoverflow.com/users/12323248/akuzminykh , 02.06.2020
 * 
 *   <pre>
 * Cumulative Iteration:
 *   the process of iterating with the results of the previous iterations
 *   
 *   definition:
 *   D domain (collection of X)
 *   X &isin; of domain, Data/Object/Value
 *   R results of previous iterations (List<Y>)
 *   
 *   f(R, X) iteration cycle/Function for current X element with the knowledge of previous iteration results R
 *     
 *   
 *   for X &isin; D {
 *     R.add(R, X)
 *   }
 *   
 *   ORDER sensible! use ordered Collections such as Lists and so on.
 *   </pre>
 * @param <X>
 * @param <Y>
 * @param col
 * @param loopIteration
 */
public static <X, Y, LIST extends List<Y>> void cumulativeIteration(final Collection<X> col, final BiFunction<List<Y>, X, Y> loopIteration, Class<Y> clazz) {
    final ArrayList<Y> previous = new ArrayList<>();
    col.forEach(x -> previous.add(loopIteration.apply(previous, x)));
}

/**
 * @author levent.dag
 * https://stackoverflow.com/users/9648047/levent-dag
 * 
 * naming idea with "akuzminykh"
 * https://stackoverflow.com/users/12323248/akuzminykh , 02.06.2020
 * 
 * Same as {@link Essentials#additiveIteration(Collection, BiFunction)}, but the previous results can be mapped.
 * 
 * @param <X>
 * @param <Y>
 * @param col
 * @param loopIteration
 * @param mapper
 */
public static <X, Y> void mappedCumulativeIteration(final Collection<X> col, final BiFunction<Map<String, Y>, X, Y> loopIteration, final Function<X, String> mapper) {
    final Map<String, Y> previous = new LinkedHashMap<>();
    col.forEach(x -> previous.put(mapper.apply(x), loopIteration.apply(previous, x)));
}

кроме того, как указал @daniu, вы можете добиться этого с помощью сборщика, если хотите собрать данные.

col.stream().<List<Y>>collect(()->new ArrayList<>(), (pre, current) -> pre.add(loopIteration.apply(pre, current)), List::addAll); 

Или как самостоятельный коллектор

/**
 * @author levent.dag
 * https://stackoverflow.com/users/9648047/levent-dag
 * 
 * naming idea with "akuzminykh"
 * https://stackoverflow.com/users/12323248/akuzminykh , 02.06.2020
 * 
 *   <pre>
 * Cumulative Iteration:
 *   the process of iterating with the results of the previous iterations
 *   
 *   definition:
 *   D domain (collection of X)
 *   X &isin; of domain, Data/Object/Value
 *   R results of previous iterations (List<Y>)
 *   
 *   f(R, X) iteration cycle/Function for current X element with the knowledge of previous iteration results R
 *     
 *   
 *   for X &isin; D {
 *     R.add(R, X)
 *   }
 *   
 *   ORDER sensible! use ordered Collections such as Lists and so on.
 *   </pre>
 *
 * @param <OBJECT>
 * @param <RESULT>
 */
public class CumulativeListCollector<OBJECT, RESULT> implements Collector<OBJECT, List<RESULT>, List<RESULT>> {

    private final BiFunction<List<RESULT>, OBJECT, RESULT> loopIteration;

    public CumulativeListCollector(final BiFunction<List<RESULT>, OBJECT, RESULT> loopIteration) {
        this.loopIteration = loopIteration;
    }

    public static <O,R> CumulativeListCollector<O, R> of(final BiFunction<List<R>, O, R> loopIteration) {
        return new CumulativeListCollector<>(loopIteration);
    }

    @Override
    public Supplier<List<RESULT>> supplier() {
        return ()->new ArrayList<RESULT>();
    }

    @Override
    public BiConsumer<List<RESULT>, OBJECT> accumulator() {
        return (pre, current) -> pre.add(this.loopIteration.apply(pre, current));
    }

    @Override
    public Function<List<RESULT>, List<RESULT>> finisher() {
        return Function.identity();
    }

    @Override
    public BinaryOperator<List<RESULT>> combiner() {
        return (left, right)->{left.addAll(right); return left;};
    }

    @Override
    public Set<Characteristics> characteristics() {
        return Set.of();
    }
}

person Levent Dag    schedule 02.06.2020    source источник
comment
Вы ищете для этого имя?   -  person Sweeper    schedule 02.06.2020
comment
@Sweeper да, если эта концепция существует   -  person Levent Dag    schedule 02.06.2020
comment
@akuzminykh да, я мог бы сделать это, как я показал в разделе кода, однако я хотел бы знать, существует ли уже эта концепция, и если да, то как она называется.   -  person Levent Dag    schedule 02.06.2020
comment
Мне это не кажется таким уж особенным или умным, чтобы оно стоило специального названия...   -  person akuzminykh    schedule 02.06.2020
comment
Это напоминает мне рекурсию в Haskell: разделить список на первый элемент и остальные элементы. Сделайте что-нибудь с первым элементом, затем рекурсивно вызовите функцию для остальных элементов.   -  person Sweeper    schedule 02.06.2020
comment
@akuzminykh да, возможно, вы правы, однако было бы полезно иметь для этого имя, потому что как вы собираетесь говорить о чем-то, если у него нет названия? Объяснение концепции снова и снова не является решением здесь. Следуя этой логике, мы также можем сказать, зачем давать объекту имя Таблица.   -  person Levent Dag    schedule 02.06.2020
comment
@LeventDag Тогда, я думаю, какое имя вы бы ему дали? Может быть, вы можете дать ему имя, и тогда оно установится, например. Levent-for. :D   -  person akuzminykh    schedule 02.06.2020
comment
@akuzminykh хорошо, в этом случае я бы назвал его SuccessiveForEach, потому что каждая итерация является преемником и учитывает своего предшественника. Или SupplementingForEach, но я не знаю, нравится ли мне это слово. Я открыт для имен идей.   -  person Levent Dag    schedule 02.06.2020
comment
@LeventDag Может быть, аддитивная итерация? Потому что на каждой итерации вы добавляете данные, которые будут использоваться в следующей итерации. Может быть, что-то с Series, например. итерация серии, а также. В любом случае, я очень сомневаюсь, что для него существует какое-то уже устоявшееся название.   -  person akuzminykh    schedule 02.06.2020
comment
@akuzminykh да, я думаю, что аддитивная итерация является наиболее подходящей.   -  person Levent Dag    schedule 02.06.2020
comment
Отвечает ли это на ваш вопрос? Есть ли в java простейший возможный метод уменьшения/свертывания?   -  person Joe    schedule 02.06.2020
comment
@ Джо, нет, к сожалению, нет. Сокращение действительно сводит коллекцию к одному значению, что здесь не является целью. Поэтому мы не хотим накапливать наши значения до одного, а хотим зацикливать каждое значение со знанием результатов его предшественников.   -  person Levent Dag    schedule 02.06.2020
comment
Вы можете легко сделать это с помощью Stream#collect(поставщик, накопитель, объединитель) с подходящей реализацией накопителя.   -  person daniu    schedule 02.06.2020
comment
На самом деле, я думаю, что кумулятивная итерация может быть лучшим названием. Это из Совокупная сумма, которая представляет собой сумму частичных сумм заданной последовательности или Серии. На каждой итерации вы используете кумулятивно созданный список из последней итерации. Блин, это что-то из области науки.   -  person akuzminykh    schedule 02.06.2020
comment
@akuzminykh да, вот оно! Я искал слово кумулятивный. Итак, кумулятивная итерация?   -  person Levent Dag    schedule 02.06.2020
comment
@daniu mhm, поэтому вы могли бы предложить сборщик, например col.stream().‹List‹Y››collect(()-›new ArrayList‹›(), (pre, current) -> pre.add(loopIteration.apply( предыдущий, текущий)), List::addAll); Я имею в виду да, но по сути мы не пытаемся собирать данные, но спасибо за ваш вклад!   -  person Levent Dag    schedule 02.06.2020
comment
@LeventDag Да, я думаю, это звучит довольно правильно и кажется уместным.   -  person akuzminykh    schedule 02.06.2020
comment
@akuzminykh раздел Edit2 теперь должен содержать все   -  person Levent Dag    schedule 02.06.2020