Java потоци за начинаещи: Въведение в използването на потоци в Java

Java потоци за начинаещи: Въведение в използването на потоци в Java

Потоците на Java 8 позволяват на разработчиците да извличат точни данни от голяма колекция, използвайки набор от предварително дефинирани операции.





Преди пускането на Java 8 използването на термина „поток“ в Java автоматично ще бъде свързано с I/O. Въпреки това, Java 8 въведе поток, който може да бъде посочен като набор от изчислителни стъпки, свързани заедно в това, което обикновено се нарича „поточен канал“.





Тази статия ще ви запознае с потоците на Java 8 и ще покаже как те могат да бъдат полезни във вашите проекти.





Какво е поток?

Потокът е Java интерфейс, който взема източник, провежда набор от операции за извличане на конкретни данни, след което предоставя тези данни на приложението за употреба. По същество той ви позволява да извличате специализирани данни от колекция от обобщени данни.

Как работят потоците

Потоковият тръбопровод винаги започва с източник. Типът източник зависи от типа данни, с които се занимавате, но два от по -популярните са масиви и колекции.



За да трансформирате колекцията в първоначален поток, ще трябва да добавите поток () функция към източника. Това ще постави източника в потока на потока, където няколко различни междинни операции (като напр филтър () и вид() ) може да работи с него.

След като се извършат всички необходими междинни операции, можете да въведете терминална операция (като напр за всеки() ), който ще произведе предварително извлечените данни от източника.





Живот без потоци

Java 8 беше пусната през 2014 г., но преди това разработчиците на Java все още трябваше да извлекат специализирани данни от колекция от общи данни.

как да добавите екранни снимки към историята на instagram

Да приемем, че имате списък със случайни знаци, които са комбинирани със случайни числа, за да образуват уникални низови стойности, но искате само стойностите, които започват с символа C и искате да подредите резултата във възходящ ред. По този начин бихте извлекли тези данни без потоци.





Свързани: Какво трябва да знаете за използването на низове в Java

Пример за филтриране и сортиране на стойности без потоци


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'C13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'C16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//declare the array list will store needed values
List requiredValues = new ArrayList();
//extracting the required values and storing them in reqquiredValues
randomValues.forEach(value -> {
if(value.startsWith('C')) {
requiredValues.add(value);
}
});
//sort the requiredValues in ascending order
requiredValues.sort((String value1, String value2) -> value1.compareTo(value2));
//print each value to the console
requiredValues.forEach((String value) -> System.out.println(value));
}
}

Също така ще трябва да декларирате и инициализирате списъка с масиви, независимо дали използвате потоци или друг метод за извличане. Това, което не би трябвало да правите, ако използвате потоци, е да декларирате нова променлива, която да съдържа необходимите стойности, нито да създавате другите пет плюс реда в кода в горния пример.

Свързани: Как да създавате и извършвате операции с масиви в Java

Горният код произвежда следния изход в конзолата:


C11
C12
C13
C14
C15
C16

Живот с потоци

В програмирането ефективността говори за постигане на същия резултат със значително по -малко код. Това е точно това, което поток тръбопроводът прави за програмист. Така че следващия път, когато някой попита: защо е важно да използвате потоци във вашия проект? Просто казано: потоците поддържат ефективно програмиране.

Продължавайки с нашия пример по -горе, ето как въвеждането на потоци трансформира цялата програма.

Филтриране и сортиране на стойности с пример за поток


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'C13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'C16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

Горният код демонстрира колко мощен е интерфейсът на потока. Той взема списък със случайни стойности на масива и го трансформира в поток с помощта на поток () функция. След това потокът се редуцира до списък с масиви, който съдържа необходимите стойности (което са всички стойности, започващи с ° С ), използвайки филтър () функция.

Както можете да видите в горния пример, ° С стойностите са подредени на случаен принцип в списъка с масиви. Ако трябва да отпечатате потока в този момент в тръбопровода, стойността C15 ще бъдат отпечатани първи. Следователно, вид() функцията се въвежда в потока на потока, за да пренареди новия масив във възходящ ред.

Крайната функция в поточния тръбопровод е a за всеки() функция. Това е терминална функция, която се използва за спиране на поточния канал и дава следните резултати в конзолата:


C11
C12
C13
C14
C15
C16

Междинни поточни операции

Има обширен списък от междинни операции, които могат да се използват в поточен канал.

Потоковият тръбопровод винаги започва с един източник и a поток () функция и винаги завършва с една терминална операция (макар че има няколко различни, от които да избирате.) Но между тези две секции има списък от шест междинни операции, които можете да използвате.

В нашия пример по-горе се използват само две от тези междинни операции --- филтър () и вид() . Междинната операция, която избирате, ще зависи от задачите, които искате да изпълните.

Ако някоя от стойностите, които започват с C в нашия списък с масиви по -горе, бяха с малки букви и ние изпълнихме същите междинни операции върху тях, щяхме да получим следния резултат.

Извършване на операции по филтриране и сортиране на малки стойности Пример


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'c13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'c16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

Горният код ще генерира следните стойности в конзолата:


C11
C12
C14
C15

Единственият проблем с изхода по -горе е, че той не представя точно всички ° С стойности в нашия списък с масиви. Добър начин да поправите тази малка грешка е да въведете друга междинна операция в потока на потока; тази операция е известна като map () функция.

Пример за използване на функцията на картата


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'c13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'c16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//transforms all lower case characters to upper case,
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().map(String::toUpperCase).filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

The map () функция трансформира обект от едно състояние в друго; в нашия пример по -горе той трансформира всички малки букви в списъка с масиви в главни символи.

Поставянето на map () функция точно преди филтър () функция извлича всички стойности, които започват с ° С от списъка с масиви.

Кодът по -горе произвежда следния резултат в конзолата, представящ успешно всички ° С стойности в списъка с масиви.


C11
C12
C13
C14
C15
C16

Другите три междинни операции, които можете да използвате във вашите приложения, включват:

  • надниквам ()
  • limit ()
  • пропуснете ()

Потоците на Java 8 улесняват създаването на ефективен код

С потоците на Java 8 можете да извлечете допълнителни специфични, подходящи данни от голям източник с един ред код. Стига да включите началното поток () функция и терминален оператор, можете да използвате всяка комбинация от междинни операции, които осигуряват подходящи резултати за вашата цел.

как да настроите нов имейл адрес

Ако се чудите за кода, затворен в нашия филтър () функция; той е известен като „ламбда израз“. Ламбда изразите са друга функция, въведена с Java 8 и има много късчета, които може да ви бъдат полезни.

Дял Дял Туит електронна поща Бързо въведение в Java 8 Lambdas

Ако сте програмист на Java и искате да научите повече за ламбдите на Java 8, в тази статия ще разгледаме по -отблизо ламбда синтаксиса и използването.

Прочетете Напред
Свързани теми
  • Програмиране
  • Java
  • Уроци по кодиране
За автора Кадейша Кийн(21 статии са публикувани)

Кадейша Кийн е разработчик на софтуер с пълен стек и технически/технологичен писател. Тя има отличителната способност да опростява някои от най -сложните технологични концепции; производство на материал, който може лесно да бъде разбран от всеки начинаещ в технологиите. Тя е запалена по писането, разработването на интересен софтуер и пътуването по света (чрез документални филми).

Още от Kadeisha Kean

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате