powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Устройство Stream-ов
8 сообщений из 33, страница 2 из 2
Устройство Stream-ов
    #39938334
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
PetroNotC Sharp
faustgreen,
Ну и какой практический вывод с этими потоками?
Потоки не имеют отношения к стримам вообще.


Пока спортивный интерес, хочу понять как там все устроено, а там может и польза будет.
Как например со строками:
String s = "";
s= s + "a";
s= s + "b";
s= s + "c";
...
Можно знать, что s= s + "b"; возвращает предыдущую строку + новую. Но зная внутреннюю структуру так делать не будешь.

Дизассемблируй байткод и посмотри что внутри.
Современные компилляторы 90% распознают это
как StringBuilder.
...
Рейтинг: 0 / 0
Устройство Stream-ов
    #39938336
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
спортивный интерес
теория без практики мертва.
Баланс соблюдай.
...
Рейтинг: 0 / 0
Устройство Stream-ов
    #39938926
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглили немного про стримы, текущее понимание:
Картинка из первого поста вроде как правильная, т.е. стрим это цепочка операций через которую "пролетают" элементы поштучно.
Непонятки были с тем как в этой цепочке работает операция sorted и ей подобные. в этом посте нашел ответ:
Код: java
1.
Sorting a stream is necessarily an eager/blocking operation.

И тут .
Код: java
1.
2.
sorted() is a stateful intermediate operation which has been implemented by buffering the entire contents and sorting it,
 before passing any elements to the downstream operations


Т.е. на этой операции происходит блокировка пока все элементы не достигнут этой операции.

Вот тут еще приведен императивный аналог стрим выражения:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
List<String> result = Stream.of("java", "streams", "are", "great", "stuff")
    .filter(s -> {
                  System.out.println("filtering " + s);
                  return s.length()>=4;
                 })
    .map(s -> {
               System.out.println("mapping " + s);
               return s.toUpperCase();
              })
    .limit(3)
    .collect(Collectors.toList());
System.out.println("Result:");
result.forEach(System.out::println);



Императивный вариант:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
String[] source = { "java", "streams", "are", "great", "stuff"};
List<String> result = new ArrayList<>();
int limit = 3;
for(String s: source) {
    System.out.println("filtering " + s);
    if(s.length()>=4) {
        System.out.println("mapping " + s);
        String t = s.toUpperCase();
        if(limit-->0) {
            result.add(t);
        }
        else break;
    }
}



Мне стало немного понятнее, может еще кому то пригордиться. А возможно я где то ошибся и меня поправят )
...
Рейтинг: 0 / 0
Устройство Stream-ов
    #39938929
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока разбирался заметил еще одну штуку:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public class InvocationOrder {
	  public static void main (String[] args) {
	        IntStream stream = IntStream.range(1, 5);
	        stream = stream.peek(i -> log("starting", i)).sorted().peek(i -> log("SORT:", i))
	                       .filter(i -> { log("filtering", i);
	                                      return i % 2 == 0;})
	                       .peek(i -> log("post filtering", i));
	        log("Invoking terminal method count.");
	        log("The count is", stream.count());
	        
	        System.out.println(); 
	        	        
	        IntStream stream2 = IntStream.range(1, 5).parallel();
	        stream2 = stream2.peek(i -> log("starting", i)).sorted().peek(i -> log("SORT:", i))
	                       .filter(i -> {
	                           log("filtering", i);
	                           return i % 2 == 0;
	                       })
	                       .peek(i -> log("post filtering", i));
	        log("Invoking terminal method count.");
	        log("The count is", stream2.count());
	    }
	  
	    public static void log (Object... objects) {
	        String s = LocalTime.now().toString();
	        for (Object object : objects) {
	            s += " - " + object.toString();
	        }
	        System.out.println(s);
	        // putting a little delay so that we can see a clear difference
	        // with parallel stream.
	        try {
	            Thread.sleep(1);
	        } catch (InterruptedException e) {
	            e.printStackTrace();
	        }
	    }
}


Если у нас источник сортированный то блокировки на операции сортед вроде как не происходит:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
21:07:40.734 - Invoking terminal method count.
21:07:40.741 - starting - 1
21:07:40.742 - SORT: - 1
21:07:40.743 - filtering - 1
21:07:40.744 - starting - 2
21:07:40.745 - SORT: - 2
21:07:40.746 - filtering - 2
21:07:40.747 - post filtering - 2
21:07:40.748 - starting - 3
21:07:40.749 - SORT: - 3
21:07:40.750 - filtering - 3
21:07:40.751 - starting - 4
21:07:40.752 - SORT: - 4
21:07:40.754 - filtering - 4
21:07:40.755 - post filtering - 4
21:07:40.756 - The count is - 2

21:07:40.759 - Invoking terminal method count.
21:07:40.767 - starting - 4
21:07:40.770 - starting - 3
21:07:40.772 - starting - 1
21:07:40.772 - starting - 2
21:07:40.775 - SORT: - 2
21:07:40.774 - SORT: - 3
21:07:40.776 - filtering - 2
21:07:40.776 - filtering - 3
21:07:40.777 - post filtering - 2
21:07:40.777 - SORT: - 4
21:07:40.778 - SORT: - 1
21:07:40.778 - filtering - 4
21:07:40.779 - filtering - 1
21:07:40.779 - post filtering - 4
21:07:40.780 - The count is - 2



Если заменим IntStream.range(1, 5) на IntStream.of(8,4,7,1,3) то вывод будет:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
21:10:11.934 - Invoking terminal method count.
21:10:11.955 - starting - 8
21:10:11.958 - starting - 4
21:10:11.959 - starting - 7
21:10:11.960 - starting - 1
21:10:11.974 - starting - 3
21:10:11.977 - SORT: - 1
21:10:11.978 - filtering - 1
21:10:11.979 - SORT: - 3
21:10:11.985 - filtering - 3
21:10:11.986 - SORT: - 4
21:10:11.987 - filtering - 4
21:10:11.988 - post filtering - 4
21:10:11.989 - SORT: - 7
21:10:11.990 - filtering - 7
21:10:11.993 - SORT: - 8
21:10:11.997 - filtering - 8
21:10:12.002 - post filtering - 8
21:10:12.007 - The count is - 2

21:10:12.009 - Invoking terminal method count.
21:10:12.018 - starting - 3
21:10:12.019 - starting - 1
21:10:12.020 - starting - 7
21:10:12.021 - starting - 4
21:10:12.022 - starting - 8
21:10:12.026 - SORT: - 4
21:10:12.027 - filtering - 4
21:10:12.028 - post filtering - 4
21:10:12.029 - SORT: - 8
21:10:12.030 - filtering - 8
21:10:12.036 - post filtering - 8
21:10:12.036 - SORT: - 3
21:10:12.038 - SORT: - 7
21:10:12.038 - filtering - 3
21:10:12.039 - filtering - 7
21:10:12.040 - SORT: - 1
21:10:12.041 - filtering - 1
21:10:12.042 - The count is - 2
...
Рейтинг: 0 / 0
Устройство Stream-ов
    #39938931
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твои эксперименты не имеют смысла пока ты САМ не сделаешь из них свои правильные выводы.
...
Рейтинг: 0 / 0
Устройство Stream-ов
    #39938935
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, Это последний пост в теме, со стримами вроде разобрался. Просто, как писал выше, не люблю бездумно использовать методы, а сечас вроде все уложилось в голове.
...
Рейтинг: 0 / 0
Устройство Stream-ов
    #39968599
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще немного инфографики: https://annimon.com/article/2778
...
Рейтинг: 0 / 0
Устройство Stream-ов
    #39968735
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
faustgreen
пропущено...


Пока спортивный интерес, хочу понять как там все устроено, а там может и польза будет.
Как например со строками:
String s = "";
s= s + "a";
s= s + "b";
s= s + "c";
...
Можно знать, что s= s + "b"; возвращает предыдущую строку + новую. Но зная внутреннюю структуру так делать не будешь.

Дизассемблируй байткод и посмотри что внутри.
Современные компилляторы 90% распознают это
как StringBuilder.


Разве начиная с Java 9 будет не StringConcatFactory?
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Устройство Stream-ов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]