Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
Как я понимаю стримы на данный момент:
Стрим можно представить в виде трубы с секциями, через которую движутся элементы. Эта труба имеет вентиль вначале, который открывается терминальной операцией. В каждой секции с элементом, что-то происходит, согласно инструкции, например:

blocks.stream()
      .map(block ‑> block.squash())
      .filter(block ‑> block.getColor() != YELLOW)
      .forEach(block ‑> block.display());


Картинка с другого сайта.

С помощью метода peek можно увидеть это движение:
		Stream.of(1, 2, 3, 4, 5)
		      .peek((e) -> System.out.println("Stream element:" + e))
		      .filter((e)-> e>1)
		      .peek((e) -> System.out.println("Filtered element:" + e))
		      .map(String::valueOf)
		      .peek((e) -> System.out.println("Mapped element:" + e))
		      .collect(Collectors.toList());

результат:
Stream element:1
Stream element:2
Filtered element:2
Mapped element:2
Stream element:3
Filtered element:3
Mapped element:3
Stream element:4
Filtered element:4
Mapped element:4
Stream element:5
Filtered element:5
Mapped element:5


Дополнительно:
The intermediate operations are classifiable in:

Stateful
    distinct()
    sorted()
    limit (long l)
    skip (long l)

Stateless
    map (Function f)
    flatMap (Function f)
    filter (Predicate p)
    peek (Consumer c)


Т.е. получается, что изначально Stream не имеет состояния, а просто читает по элементу из источника и пропускает его через набор операций. Но для сортировки элементов нам нужно иметь весь их набор.
Получается, что на Stateful операциях "труба" как бы перекрывается, пока все элементы не достигнут этого этапа, после чего выполняется Stateful операция, которая после ее выполнения сама становится источником данных для последующих операций.

Я прав ?
17 мар 20, 12:18    [22100510]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
faustgreen
Но для сортировки элементов
это противоестественно для стрима и реактивного программирования
17 мар 20, 12:25    [22100519]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 948
faustgreen,

Stream - это типа стандартных потоков в *nix, только с типами и функциями.
17 мар 20, 12:36    [22100534]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 948
PetroNotC Sharp,

А вся эта труба на яве может работать параллельно? Т.е. filter в своём потоке, map в своём.

Сообщение было отредактировано: 17 мар 20, 12:36
17 мар 20, 12:36    [22100536]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
crutchmaster
PetroNotC Sharp,

А вся эта труба на яве может работать параллельно? Т.е. filter в своём потоке, map в своём.
для чего?
Процессор будет переключать контекст, пыхтеть, работать. А смысл?
17 мар 20, 12:44    [22100543]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 948
PetroNotC Sharp,

Ну, с другой стороны - да.
17 мар 20, 12:47    [22100547]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
crutchmaster,
Думаю что стрим это разнесенный во времени процесс.
А процессор сам очень быстрый.
То есть проблема в медленном ПОЛУЧЕНИИ стрима.
Нечего параллелить.
Имхо
17 мар 20, 12:49    [22100550]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1085
Читайте джавадоки.

java.util.stream
...
All streams operations can execute either in serial or in parallel. The stream implementations in the JDK create serial streams unless parallelism is explicitly requested. For example, Collection has methods Collection.stream() and Collection.parallelStream(), which produce sequential and parallel streams respectively;...
17 мар 20, 13:04    [22100569]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
PetroNotC Sharp,
автор
это противоестественно для стрима и реактивного программирования

Из доков по стриму:
No storage. A stream is not a data structure that stores elements; instead, it conveys elements from a source such as a data structure, an array, a generator function, or an I/O channel, through a pipeline of computational operations.


Но операция sorted() должна же где то сохранить результат (насколько я знаю источник данных стрима не изменяется). Вот и интересно где это хранится, или возможно это работает как-то подругому?
17 мар 20, 13:08    [22100573]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
Просто хочется понять абстрактную структуру стрима, чтобы действовать на уровне понимания, а не заучивания методов. Многие вещи потом будут сами вытекать. Например, что порядок операций имеет значение и лучше ставить filter в начале и т.д.
17 мар 20, 13:17    [22100582]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
Переформулирую вопрос:
Как примерно буде выглядеть гифка из первого поста, если мы после команды filter() добавим команду sorted() ?
17 мар 20, 13:26    [22100589]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
faustgreen,
Сортировку что в бд, что в стримах делают в самом конце.
Например в бд перед выврдом на экран.
В стриме тоже сортируй при выводе toList()
В чем проблема?
Тоже самое что в бд.
17 мар 20, 13:33    [22100594]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
faustgreen
Переформулирую вопрос:
Как примерно буде выглядеть гифка из первого поста, если мы после команды filter() добавим команду sorted() ?
так же как при команде Count.
Поток УНИЧТОЖАЕТСЯ.
17 мар 20, 13:35    [22100595]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
Zzz79
Member

Откуда:
Сообщений: 66
faustgreen
Переформулирую вопрос:
Как примерно буде выглядеть гифка из первого поста, если мы после команды filter() добавим команду sorted() ?

скорей всего ты думаешь что стрим это как эрей лист изнутри - тоесть имеет элементы
но это не так
он работает с датой ,как с единым целым и гифка твоя не верна
17 мар 20, 13:38    [22100598]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
Zzz79
Member

Откуда:
Сообщений: 66
PetroNotC Sharp
faustgreen,
Сортировку что в бд, что в стримах делают в самом конце.
Например в бд перед выврдом на экран.
В стриме тоже сортируй при выводе toList()
В чем проблема?
Тоже самое что в бд.

ничто не мешает сделать сортировку сначала ,а затем отфильтровать и наоборот
17 мар 20, 13:39    [22100600]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
PetroNotC Sharp,

Набрасал простой код:
Stream<Integer> stream = Stream.of(1, 2, 3);
		
long count = stream.count();
System.out.println(count);
//count = stream.count(); // java.lang.IllegalStateException: stream has already been operated upon or closed
		
Stream<Integer> stream2 = Stream.of(1, 2, 3);
		
Stream<Integer> stream3 = stream2.sorted();
// long count2 = stream2.count(); // java.lang.IllegalStateException: stream has already been operated upon or closed


На самом деле поток после sorted() закрывается... Просто думал, что это происходит только с терминальными операциями.
17 мар 20, 13:50    [22100614]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
Zzz79
Member

Откуда:
Сообщений: 66
faustgreen
PetroNotC Sharp,

Набрасал простой код:
Stream<Integer> stream = Stream.of(1, 2, 3);
		
long count = stream.count();
System.out.println(count);
//count = stream.count(); // java.lang.IllegalStateException: stream has already been operated upon or closed
		
Stream<Integer> stream2 = Stream.of(1, 2, 3);
		
Stream<Integer> stream3 = stream2.sorted();
// long count2 = stream2.count(); // java.lang.IllegalStateException: stream has already been operated upon or closed


На самом деле поток после sorted() закрывается... Просто думал, что это происходит только с терминальными операциями.

ничего там не закрывается ,сортед не является терминальной операцией
17 мар 20, 13:52    [22100617]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
faustgreen
На самом деле поток после sorted() закрывается...
ты по логике суди.
Как сортировать, если поток конец на дальнем востоке, а головка))) уже в москве)))
17 мар 20, 13:55    [22100624]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
Zzz79,
автор
ничего там не закрывается ,сортед не является терминальной операцией

Я не особо в этом секу, пока разбираюсь, но по факту стрим закрывается - если раскоментить код
// long count2 = stream2.count(); // java.lang.IllegalStateException: stream has already been operated upon or closed

ИДЕ брасает эксепшен, хотя терминальных операций со стоимом stream2 не было
17 мар 20, 13:57    [22100627]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
Zzz79
Member

Откуда:
Сообщений: 66
faustgreen

ИДЕ брасает эксепшен, хотя терминальных операций со стоимом stream2 не было

советую подучить стрим АПИ
ты пытаешься один стрим два раза поюзать?это очень интересно)
17 мар 20, 14:00    [22100631]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
Zzz79,
Где твой код, учитель?
17 мар 20, 14:01    [22100634]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
Zzz79
faustgreen

ИДЕ брасает эксепшен, хотя терминальных операций со стоимом stream2 не было

советую подучить стрим АПИ
ты пытаешься один стрим два раза поюзать?это очень интересно)


Да, похоже на то :
		
Stream<Integer> stream4 = Stream.of(1, 3, 4, 0);
stream4.filter(e->e>0);
stream4.map(e->e); // Exception ...


Черт, я запутался.

К тому же появляются все новые и новые вопросы ... Например, если мы создадим лист со значениями и да потока, один будет в цикле добавлять новые элементы в лист, а второй в тоже самое время будет обрабатывать тот же лист через стреам:
List.stram.filter ....
В стриме будут только элементы на момент созадния стрима или также те, которые добавит второй поток ?
17 мар 20, 14:14    [22100648]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
Zzz79
Member

Откуда:
Сообщений: 66
faustgreen,
я смогу попозже тебе нормально все объяснить,сейчас работой завалили)
17 мар 20, 14:40    [22100675]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
автор
К тому же появляются все новые и новые вопросы ... Например, если мы создадим лист со значениями и да потока, один будет в цикле добавлять новые элементы в лист, а второй в тоже самое время будет обрабатывать тот же лист через стреам:
List.stram.filter ....
В стриме будут только элементы на момент созадния стрима или также те, которые добавит второй поток ?

		List<Integer> list = new ArrayList<>(100);
		for(int i=0; i<1000; i++)
			list.add(i);

		Thread t1 = new Thread(() -> {
			try {
				Thread.sleep(1000);
				for (int i=10;i<1000;i++) {
					list.add(i);
					System.out.println(Thread.currentThread().getName() + i);
				}	
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		});

		t1.start();
		Thread.sleep(1000);
		list.stream().peek(i->System.out.println(Thread.currentThread().getName())).forEach(System.out::println);

Словил:
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)


В общеме, много непонятного по теме стримов, ушел гуглить дальше...
17 мар 20, 14:41    [22100676]     Ответить | Цитировать Сообщить модератору
 Re: Устройство Stream-ов  [new]
faustgreen
Member

Откуда:
Сообщений: 377
Zzz79,
автор
я смогу попозже тебе нормально все объяснить,сейчас работой завалили)

Ок, спасибо!
17 мар 20, 14:42    [22100677]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить