Всем привет! 
Закончил тему:
1. Потоки данных.
- От итерации к потоковым операциям
- Создание потока данных
- Методы filter(), map() и flatMap()
- Извлечение подпотоков и объединение потоков данных
- Другие операции преобразования потоков данных
- Простые методы сведения
- Тип Optional
- Накопление результатов
- Накопление результатов в отображениях
- Группирование и разделение
- Н исходящие коллекторы
- Операции сведения
- Поток и данных примитивных типов
- Параллельные потоки данных
В сравнении с коллекциями потоки данных обеспечивают представление данных, позволяющее указать вычисления на более высоком концептуальном уровне,
чем коллекции. С помощью потока данных можно указать, что и как именно требуется сделать с данными, а планирование операций предоставить конкретной
реализации.
Потоки данных действуют по принципу "что, а не как делать".
Объект типа Opt ional<T> служит оболочкой для объекта обобщенного типа
Т или же ни для одного из объектов. В первом случае считается, что значение
присутствует. Тип Optional<T> служит в качестве более надежной альтернативы ссылке на обобщенный тип т, которая делается на объект или оказывается
пустой. Но этот тип надежнее, если правильно им пользоваться.
***************************
Начал изучать эту книгу. Сау S. Horstmann. Библиотека профессионала. Том 2. Расширенные средства программирования
Выбирал выбирал, и выбрал эту, для начала. Вернее для продолжения.
Вот тема выбора книги
Ну в общем изучил первую главу, Потоки данных Stream.
Автор очень понятно объясняет, много простейших примеров, которые закрепляют многие вещи.
Понятный код, пока изучаешь искомую тему, повторяются и другие вещи.
После каждого параграфа описание всех используемых методов.
Вроде все понятно.
Что по изученному материалу:
Потоки данных. Очень круто. Очень сокращается код.
Но тему я фактически получается не изучил, потому что на практике мне ничего не удалось реализовать! Ничего не работает!
Из самого потока невозможно вытащить какие либо данные, приходится загонять этот поток обратно в список.
С самим потоком мне не удается сделать более одной операции, далее компилятор пишет: stream has already been operated upon or closed
В общем сделал две домашние задачи, вроде применил потоки, но зачем я их применил, непонятно, результата нет.
Еще и промучился с невероятными фокусами, думал уже я с ума сошел, в итоге оказалось, что глючит IntelliJ IDEA 2022.3.3 (Community Edition).
Вот тема ее глюков.
Может кто поможет, может я делаю что то не так? 
Домашнее задание:
Задача 1.
Необходимо создать класс клиента со следующими полями: уникальный идентификатор, имя, возраст.
Также у клиента есть список телефонов. Класс телефона содержит само значение и тип (стационарный или мобильный).
Найти самого возрастного клиента, которой пользуется стационарным телефоном
С использованием потоков.
| 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
| package dz.dz.horstmann.stream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Stream;
/*Необходимо создать класс клиента со следующими полями: уникальный идентификатор, имя, возраст.
Также у клиента есть список телефонов. Класс телефона содержит само значение и тип (стационарный или мобильный).
Найти самого возрастного клиента, которой пользуется стационарным телефоном
С использованием потоков.
*/
public class DZHorstmann1stream1 {
public static <Optional> void main(String[] args) throws IOException {
int clientSize = 3, telCountClient = 2, telCount = 6;
int i, j, k = 0, p;
int maxAge = 0;
//читаем файл телефонов и разбиваем на слова и записываем в список
var contents = new String (Files.readAllBytes(
Paths.get("E:\\Java\\Javatxt\\DZ-Horstmann-1stream-2-phones.txt")));
String[] split = contents.split(" ");
//создаем и заполняем Лист телефонов общий
List<String> wordsPhones = new ArrayList<String>();
wordsPhones.add(0, split[k]);
wordsPhones.add(1, split[k+1]);
wordsPhones.add(1, split[k+2]);
wordsPhones.add(1, split[k+3]);
wordsPhones.add(1, split[k+4]);
wordsPhones.add(1, split[k+5]);
//читаем файл клиентов и разбиваем на слова и записываем в список
var contents2 = new String (Files.readAllBytes(
Paths.get("E:\\Java\\Javatxt\\DZ-Horstmann-1stream-1.txt")));
String[] wordsClient = contents2.split(" ");
//создаем список телефонов, где по два номера, для передачи в список клиентов
List<Phone> phonesSendList = new ArrayList<>();
i = 0;
j = 0;
k = 0;
//Заполняем клиент-лист
List<Client> clientsList = new ArrayList<Client>();
while (i < clientSize) {
phonesSendList.add(0, new Phone(split[k], split[k+1]));
//вот так не распечатывается, - это в Айдие
System.out.println("Элемент phonesSendList в строчку подряд " + phonesSendList.get(0).getNumMob() + " "
+ phonesSendList.get(0).getNumStac());
System.out.println("Элемент phonesSendList " + phonesSendList.get(0).getNumMob());
System.out.println("Элемент phonesSendList " + phonesSendList.get(0).getNumStac());
clientsList.add(i, new Client(wordsClient[j], wordsClient[j+1], wordsClient[j+2],
phonesSendList));
//мы не можем вытащить данные из переданного листа, хотя они там должны быть! а там нет нулевого элемента
//ааа, если мы пишем так //phonesSendList.clear(); то очищается не только этот список, но и список, переданный
//в другой лист в качестве параметра!
System.out.println("Бинго - " + clientsList.get(i).getPhones().get(0).getNumMob());
k = k + 2;
j = j + 3;
i++;
}
i = 0;
k = 2;
System.out.println();
//выводим список клиентов на экран
//очередные глюки, с которыми уже не хочется разбираться. при добавлении списка телефонов клаенту, распечатываются
//правильные телефоны, но при следующем распечатке списка клиентов за каждым клиентом закреплен почему то
// третий номер! причем под вторым и третим элементами этого списка телефонов лежат все оставшиеся номера!
// откуда они там лежат, не понятно, т.к. в этом списке только один элемент должен быть!
// пришлось подколхозить, чтоб из вывести правильно
System.out.println("Наш список клиентов из списка!");
while (i < clientSize) {
System.out.print(clientsList.get(i).getId());
System.out.print(" ");
System.out.print(clientsList.get(i).getName());
System.out.print(" ");
System.out.print(clientsList.get(i).getAge());
System.out.print(" ");
System.out.print(clientsList.get(i).getPhones().get(k).getNumMob() +
" " + clientsList.get(i).getPhones().get(k).getNumStac());
i++;
k--;
System.out.println();
}
i = 0;
//System.out.println("Наш список клиентов из потока");
Stream<Client> clientStream = clientsList.stream();
//эта хрень распечатывается, но на этом работа с потоком заканчивается
//System.out.println(clientStream.iterator().next().getId());
//это уже не печатается - java.lang.IllegalStateException: stream has already been operated upon or closed
//System.out.println(clientStream.getClass());
//если пытаемся снова вывести айдишник из элемента потока, то компилятор пишет, что поток уже закрыт!
//java.lang.IllegalStateException: stream has already been operated upon or closed
//System.out.println(clientStream.iterator().next().getId());
Stream<String> upCaseStream = wordsPhones.stream().map(String::toUpperCase);
//херушки - java.util.NoSuchElementException
//System.out.println(upCaseStream.iterator().next().length());
//это по книжке!!! и это должно работать! - работает, но не распечатывается!
// Stream<String> lowercaseWords =
// words.stream().map(String::toLowerCase);
// загоняем из потока данные обратно в список, от безысходности
List<Client> clientsListOut = clientStream.toList();
System.out.println();
//распечатываем список клиентов из списка, который сформировали из потока
System.out.println("Наш список клиентов из списка, сформированного из потока!");
k = 2;
while (i < clientSize) {
System.out.print(clientsListOut.get(i).getId());
System.out.print(" ");
System.out.print(clientsListOut.get(i).getName());
System.out.print(" ");
System.out.print(clientsListOut.get(i).getAge());
System.out.print(" ");
System.out.print(clientsListOut.get(i).getPhones().get(k).getNumMob() + " " +
clientsListOut.get(i).getPhones().get(k).getNumStac());
i++;
k--;
System.out.println();
}
//тип Optional. Создаем метод типа Optional. Он будет вытаскивать значение из списка - хрен там
//что мы можем? Мыф можем только создать переменную типа Optional
Optional clientOptValue;
//в книге есть такой пример созания объекта типа Optional, но он на практике не работает!
//String str = "Пример строки для типа Optional";
//Optional< String> transformed = str.map(String::toUpperCase);
//для чего нужен вообще тип Optional не понятно, ничего нельзя к нему привести
//Optional<String> stringOptList = (String)wordsPhones.iterator().next().length();
//делаем по заданию из списка
i = 0;
while (i < clientSize) {
if (Integer.parseInt(clientsListOut.get(i).getAge()) > maxAge) {
maxAge = Integer.parseInt(clientsListOut.get(i).getAge());
}
i++;
}
System.out.println();
System.out.println("Клиенты самые возрастные со стац телефонами: ");
i = 0;
k = 2;
while (i < clientSize) {
if (Integer.parseInt(clientsListOut.get(i).getAge()) == maxAge) {
System.out.print(clientsListOut.get(i).getId());
System.out.print(" ");
System.out.print(clientsListOut.get(i).getName());
System.out.print(" ");
System.out.print(clientsListOut.get(i).getAge());
System.out.print(" ");
p = 0;
System.out.print(clientsListOut.get(i).getPhones().get(k).getNumMob() + " " +
clientsListOut.get(i).getPhones().get(k).getNumStac());
}
k--;
i++;
}
System.out.println();
System.out.println();
System.out.println("Hello world!");
}
} |
|
| 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
| package dz.dz.horstmann.stream;
import java.util.List;
public class Client {
String id;
String name;
String age;
List<Phone> phones;
public Client(String id, String name, String age, List<Phone> phones) {
this.id = id;
this.name = name;
this.age = age;
this.phones = phones;
}
String getId() {
return id;
}
String getName() {
return name;
}
String getAge() {
return age;
}
List<Phone> getPhones() {
return phones;
}
} |
|
| 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
| package dz.dz.horstmann.stream;
public class Phone {
String numberMob;
String numberStac;
PhoneType type;
enum PhoneType {
STATIONARY, MOBIL;
}
Phone(String numberMob, String numberStat) {
this.numberMob = numberMob;
this.numberStac = numberStat;
}
String getNumMob() {
return numberMob;
}
String getNumStac() {
return numberStac;
}
} |
|
Результат:
Элемент phonesSendList в строчку подряд 89261111111 84951111111
Элемент phonesSendList 89261111111
Элемент phonesSendList 84951111111
Бинго - 89261111111
Элемент phonesSendList в строчку подряд 89252222222 84992222222
Элемент phonesSendList 89252222222
Элемент phonesSendList 84992222222
Бинго - 89252222222
Элемент phonesSendList в строчку подряд 89163333333 88003333333
Элемент phonesSendList 89163333333
Элемент phonesSendList 88003333333
Бинго - 89163333333
Наш список клиентов из списка!
1 Wolter 35 89261111111 84951111111
2 Rass 22 89252222222 84992222222
3 Dedpul 30 89163333333 88003333333
Наш список клиентов из списка, сформированного из потока!
1 Wolter 35 89261111111 84951111111
2 Rass 22 89252222222 84992222222
3 Dedpul 30 89163333333 88003333333
Клиенты самые возрастные со стац телефонами:
1 Wolter 35 89261111111 84951111111
Hello world!
Задача 2.
обработать список чисел и найти сумму всех чётных чисел, которые больше 10.
| 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| /*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Project/Maven2/JavaApp/src/main/java/${packagePath}/${mainClassName}.java to edit this template
*/
package dz.dz.horstmann.stream;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.ToIntFunction;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
Задача: обработать список чисел и найти сумму всех чётных чисел, которые больше 10.
*/
public class DZHorstmann2stream {
public static void main(String[] args) {
int[] arr2 = new int[10];
Arrays2D a = new Arrays2D();
a.fill();
a.print();
List arrList = Arrays.asList(a);
//создадим поток, что бы ему присвоить наш рабочий поток, над которым мы можем сделать только одну операциюпочему то
Stream<Integer> arrStream2;
Stream<Integer> arrStream = arrList.stream();
arrStream2 = arrStream.filter(number -> number > 10 && number % 2 == 0).map(number -> number + number);
//дальше уже ничего не работает
//здесь мы не может преобразовать в Integer, но блин поток и есть Integer!
//class dz.dz.horstmann.stream.Arrays2D cannot be cast to class java.lang.Integer
//System.out.println(arrStream2.iterator().next().intValue());
//List<Integer> sumList = arrStream2.toList();
//System.out.println(sumList.get(0));
//здесь, при попытке второй операции над потоком вот: java.lang.IllegalStateException: stream has already been operated
//upon or closed
//List<Integer> sumList = arrStream2.toList();
//netBeans не знает типа IпtSummaryStatistics, хотя в книге такой класс есть
//IпtSummaryStatistics summ =
// arrStream.collect(Collectors.summingInt(arrStream.filter(number -> number > 10 && number % 2 == 0));
//так не работает
//IntSummaryStatistics summ =
// arrStream.collect(Collectors.summarizingInt(arrStream.fifilter(number -> number > 10 && number % 2 == 0));
//так тоже не работает
//arrStream.forEach(Integer::sum());
System.out.println("Hello World!");
}
} |
|
| 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
| package dz.dz.horstmann.stream;
import java.util.Random;
public final class Arrays2D {
public int[] arr = new int[10];
public Arrays2D(){
createArray();
}
@SuppressWarnings("empty-statement")
public int[] createArray(){
int[] arr = new int[10];
//arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
return arr;
}
public void fill(){
Random r = new Random();
for (int i=0; i<10; i++)
arr[i] = r.nextInt(10);
}
public void print(){
for (int item : arr){
System.out.printf("%2d ", item);
}
}
} |
|
Результат:
|