Я предполагаю, что наличие более 2 предметов означает A, B, C, A + B, B + C, C + (A + B), (A + B) + (B + C) и т. Д.,и наличие 1 элемента означает A, A + A, A + (A + A), (A + A) + (A + (A + A)) и т. д., где + - бинарный оператор.
По сути, вы превращаете поток в массив, затем используете Stream.generate
, и на каждом шаге вы генерируете элемент после того, который у вас есть, сдвигаете массив влево, чтобы соответствовать новому элементу, и возвращаете старый первый элемент (который больше не являетсяв массиве).Обратите внимание, что, поскольку это имеет побочные эффекты (изменение внешнего массива), его нельзя использовать с .parallel()
.
@SuppressWarnings("unchecked")
public static <T> Stream<T> generateRest(Stream<T> stream, BinaryOperator<T> binaryOperator) {
T[] t = (T[]) stream.toArray();
if (t.length == 1) {
t = (T[]) new Object[] { t[0], binaryOperator.apply(t[0], t[0]) };
}
final T[] items = t;
return Stream.generate(() -> {
T first = items[0];
T next = binaryOperator.apply(items[0], items[1]);
System.arraycopy(items, 1, items, 0, items.length - 1);
items[items.length - 1] = next;
return first;
});
}
Вывод:
1
1
2
3
5
8
13
AAA
BB
KKKK
AAABB
BBKKKK
KKKKAAABB
AAABBBBKKKK
0
0
0
0
0
0
0
0
5040
5040