У меня был случай, когда я случайно начал разворачивать каталог файлов в корне. Он добавил файл .htaccess из моей папки с файлами, который блокирует все php
# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
php_flag engine off
</IfModule>
. Нижняя строка проверяет файл .htaccess на root.
Вы можете сделать это с помощью атомного номера. Например:
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
public class Accumulator {
public static LongStream toCumulativeSumStream(IntStream ints){
AtomicLong sum = new AtomicLong(0);
return ints.sequential().mapToLong(sum::addAndGet);
}
public static void main(String[] args){
LongStream sums = Accumulator.toCumulativeSumStream(IntStream.range(1, 5));
sums.forEachOrdered(System.out::println);
}
}
Эти выходы:
1
3
6
10
Я использовал Long для хранения сумм, потому что вполне возможно, что два ints будут хорошо дополняться Integer.MAX_VALUE
, а у длинного меньше вероятность переполнения.
Это возможно сделать с коллектором, который затем создает новый поток:
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()
, и она функционирует правильно.
Deque
и LinkedList
, правда? ArrayList
даст вам превосходную производительность и объем памяти, потому что вы никогда не добавляете, только добавляете. Вы также можете дешево оптимизировать, проверив, какой операнд из combine
короче и concat, который один на более длинный.
– Marko Topolnik
6 February 2015 в 13:54
Files.lines()
или любой другой источник, основанный на IO, вы бы видели разные размеры. Несбалансированные деревья также будут приводить к неравномерным раздельным размерам.
– Marko Topolnik
6 February 2015 в 14:31
.sequential()
в моем обновленном коде. Я также использую AtomicLong вместо AtomicReference. Возникает вопрос: «Как мне получить другой поток из этого потока», который никогда не должен использовать коллекционную или промежуточную конструкцию, если это можно избежать - сбор в список - это тяжелая операция, тогда как мой метод почти не требует дополнительного времени для потока теоретически бесконечной длины ... – Steve K 9 February 2015 в 02:46