Looking for java Keywords? Try Ask4Keywords

Java Language Категории операций по потоку


пример

Операции потоков делятся на две основные категории: промежуточные и терминальные операции и две подкатегории, без гражданства и состояния.


Промежуточные операции:

Промежуточная операция всегда ленива , например простой Stream.map . Он не вызывается до тех пор, пока поток фактически не будет потреблен. Это легко проверить:

Arrays.asList(1, 2 ,3).stream().map(i -> {
    throw new RuntimeException("not gonna happen");
    return i;
});

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


Терминальные операции

Операции терминала - это то, что вызывает потребление потока. Некоторые из наиболее распространенных - Stream.forEach или Stream.collect . Они обычно размещаются после цепочки промежуточных операций и почти всегда стремятся .


Операции без гражданства

Безгражданство означает, что каждый элемент обрабатывается без контекста других элементов. Операции бездействия позволяют эффективно обрабатывать потоки с использованием памяти. Такие операции, как Stream.map и Stream.filter которые не требуют информации о других элементах потока, считаются апатридами.


Операции со штатом

Стойкость означает, что операция по каждому элементу зависит от (некоторых) других элементов потока. Для этого требуется сохранение состояния. Операции состояния могут прерываться с длинными или бесконечными потоками. Такие операции, как Stream.sorted требуют, чтобы весь поток обрабатывался до того, как Stream.sorted какой-либо элемент, который сломается в достаточно длинном потоке элементов. Это может быть продемонстрировано длинным потоком ( выполняется на свой страх и риск ):

// works - stateless stream
long BIG_ENOUGH_NUMBER = 999999999;
IntStream.iterate(0, i -> i + 1).limit(BIG_ENOUGH_NUMBER).forEach(System.out::println);

Это вызовет Stream.sorted памяти из-за Stream.sorted :

// Out of memory - stateful stream
IntStream.iterate(0, i -> i + 1).limit(BIG_ENOUGH_NUMBER).sorted().forEach(System.out::println);