Это возможно сделать с коллектором, который затем создает новый поток:
class Accumulator {
public static void accept(List<Integer> list, Integer value) {
list.add(value + (list.isEmpty() ? 0 : list.get(list.size() - 1)));
}
public static List<Integer> combine(List<Integer> list1, List<Integer> list2) {
int total = list1.get(list1.size() - 1);
list2.stream().map(n -> n + total).forEach(list1::add);
return list1;
}
}
Это используется как:
myIntStream.parallel()
.collect(ArrayList<Integer>::new, Accumulator::accept, Accumulator::combine)
.stream();
Надеюсь, вы увидите, что важный атрибут этого коллектора заключается в том, что даже если поток параллелен, когда экземпляры Accumulator
объединены, он корректирует итоговые значения.
Это, очевидно, не так эффективно, как операция карты, потому что он собирает весь поток и затем создает новый поток. Но это не просто деталь реализации: это необходимая функция того, что потоки предназначены для потенциальной параллельной обработки.
Я протестировал ее с помощью IntStream.range(0, 10000).parallel()
, и она функционирует правильно.
Нет, похоже, что вы не можете через TF, вы можете принять существующий VPC по умолчанию, но не создавать его: https://www.terraform.io/docs/providers/aws/r/default_vpc.html .
Так что используйте AWS cli, чтобы воссоздать его (если можете), а затем используйте этого нового провайдера, чтобы принять его.