1. Проверка
Мисля, че вече може да сте отегчени да научите How да свързвате потоци от данни. Искате най-накрая да направите нещо с данните.
Класът Stream
има три стандартни метода, които не конструират потоци, а instead of това проверяват Howъв вид данни има в тях. Тези методи са: anyMatch()
, allMatch()
и noneMatch()
.
boolean anyMatch(rule)
метод
Този метод проверява дали потокът има поне един елемент, който удовлетворява правилото, което се предава на метода. Ако има такъв елемент, методът връща true
, в противен случай false
.
Примери
Код | Забележка |
---|---|
|
|
|
|
|
|
В последния пример първо запазваме само елементите, които са по-малки от нула, и след това проверяваме резултата, за да видим дали някой от филтрираните елементи е по-голям от нула. Разбира се, такива елементи вече не съществуват.
булев метод allMatch(rule).
Този метод проверява дали всички елементи в потока отговарят на правилото (известен също като предикат). Правилото се предава като аргумент на метода:
Код | Забележка |
---|---|
|
(всички елементи по-големи от нула) |
|
(има ли елементи по-малки or равни на нула?) |
|
(запазихме елементите, които са по-малки от нула) |
В последния пример първо позволяваме само елементи, които са по-малки от нула, да преминат през филтъра и след това проверяваме дали всички запазени елементи са по-малки от нула. Проверката дава положителен резултат.
булев метод noneMatch(rule).
Методът noneMatch()
проверява дали потокът няма елементи, които отговарят на предаденото правило. Това е като обратното на anyMatch()
метода.
Код | Забележка |
---|---|
|
|
|
|
|
|
2. Класове на полезност: Optional
клас
Понякога за програмистите е много неудобно да работят с null
препратки. Да предположим например, че сравнявате два низа. Ако и двете променливи не са null
, тогава можете просто да извикате s1.equals(s2)
и всичко ще работи. Но ако s1
може null
, тогава трябва да напишете code, който се справя с тази ситуация, за да избегнете NullPointerException
.
Ето защо програмистите излязоха с Optional<T>
полезния клас. Кодът му изглежда приблизително така:
Код | Забележка |
---|---|
|
Проверява дали стойността не е null Проверява дали стойността е null Връща съхранената стойност. Извежда изключение, ако стойността е нула. Връща съхранената ненулева стойност. Или ако съхранената стойност е null , тогава връща стойността, предадена като аргумент на метода. Връща съхранената ненулева стойност or хвърля изключение, ако стойността е нулева. |
Целта на този клас е просто да съхранява T обект (препратка към обект, чийто тип е T). Препратката към обект вътре в Optional<T>
обект може да бъде null
.
Този клас позволява на програмистите да пишат малко по-красив code. Да сравним:
Използване по избор | Не се използва по избор |
---|---|
|
|
Един Optional
обект винаги може да бъде сравнен с друг Optional
обект с помощта на equals
метода, дори ако те съхраняват null
препратки.
Най-просто казано, Optional
класът ви позволява да пишете "красиви" проверки за null
и "красиви" действия в случай, че даден Optional
обект съхранява null
стойност.
3. Намиране на елементи
Да се върнем в Stream
класа. Класът Stream
има още 4 метода, които ви позволяват да търсите елементи в поток. Тези методи са findFirst()
, findAny()
, min()
и max()
.
Optional<T> findFirst()
метод
Методът findFirst()
просто връща първия елемент в потока. Това е всичко, което прави.
По-интересното нещо, което трябва да се отбележи тук е, че методът не връща обект T
, а по-скоро Optional<T>
обвиващ обект. Това гарантира, че методът никога няма да се върне, null
след като не успее да намери обект.
Пример:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello
За по-голяма яснота, нека разделим последния ред на няколко реда:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello
Последният get()
метод просто извлича стойността, съхранена в Optional
обекта.
Optional<T> findAny()
метод
Методът findAny()
връща всеки елемент от потока и завършва там. Този метод е подобен на findFirst()
, но е чудесен за потоци, използвани в паралелни операции.
Когато се обработват потоци паралелно, може вече да е намерен елемент в няHowва част от потока, но все още не е ясно дали е първият or не.
Ако много елементи отговарят на всички филтри и за програмиста е важно да получи точно първия от тях, тогава методът findFirst()
е това, което трябва да се извика. Ако програмистът знае, че в действителност 0 or 1 елемент ще съответства на всички филтри, тогава е достатъчно просто да извика findAny()
- и това ще бъде по-бързо.
Optional<T> min(Comparator<T>)
метод
Методът min()
използва comparator
обект за сравняване на всички елементи в потока и връща минималния елемент. Най-удобният начин за дефиниране на обект за сравнение е с ламбда функция.
Пример за търсене на най-късия низ:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();
Optional<T> max(Comparator<T>)
метод
Методът max()
използва comparator
обект за сравняване на всички елементи в потока и връща максималния елемент. Най-удобният начин за дефиниране на обект за сравнение е с ламбда функция.
Пример за търсене на най-дългия низ:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
GO TO FULL VERSION