Потоците Java 8 позволяват на разработчиците да извличат точни данни от голяма колекция, като използват набор от предварително дефинирани операции.
Преди пускането на Java 8, използването на термина "поток" в Java автоматично ще бъде свързано с I / O. Java 8 обаче представи поток, който може да бъде посочен като набор от изчислителни стъпки, оковани заедно в това, което обикновено се нарича „поточен тръбопровод“.
Тази статия ще ви запознае с потоците Java 8 и ще покаже как те могат да бъдат полезни във вашите проекти.
Какво е поток?
Потокът е интерфейс на Java, който взема източник, извършва набор от операции за извличане на конкретни данни, след което предоставя тези данни на приложението за използване. По същество ви позволява да извличате специализирани данни от колекция от обобщени данни.
Как работят потоците
Потокът на потока винаги започва с източник. Типът източник зависи от типа данни, с които имате работа, но два от най-популярните са масиви и колекции.
За да трансформирате колекцията в първоначален поток, ще трябва да добавите
поток () функция към източника. Това ще постави източника в потока, където няколко различни междинни операции (като филтър () и вид()) може да го оперира.След като бъдат проведени всички необходими междинни операции, можете да въведете терминална операция (като за всеки()), който ще генерира предварително извлечените данни от източника.
Живот без потоци
Java 8 беше пусната през 2014 г., но преди това разработчиците на Java все още трябваше да извлекат специализирани данни от колекция от общи данни.
Да предположим, че имате списък със случайни знаци, които се комбинират с произволни числа, за да образуват уникални низови стойности, но искате само стойностите, които започват със знака „C“ и искате да подредите резултата във възходящ ред поръчка. Ето как бихте извлекли тези данни без потоци.
Свързани: Какво трябва да знаете за използването на низове в Java
Пример за филтриране и сортиране на стойности без потоци
импортиране на java.util. ArrayList;
импортиране на java.util. Масиви;
импортиране на java.util. Списък;
публичен клас Main {
публична статична void main (String [] args) {
// декларираме и инициализираме списъка с масиви
Списък 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"
);
// декларираме, че списъкът с масиви ще съхранява необходимите стойности
Списък requiredValues = нов ArrayList <> ();
// извличане на необходимите стойности и съхраняване в reqquiredValues
randomValues.forEach (стойност -> {
if (value.startsWith ("C")) {
requiredValues.add (стойност);
}
});
// сортиране на requiredValues във възходящ ред
requiredValues.sort ((String value1, String value2) -> value1.compareTo (value2));
// отпечатваме всяка стойност в конзолата
requiredValues.forEach ((String стойност) -> System.out.println (стойност));
}
}
Също така ще трябва да декларирате и инициализирате списъка с масиви, независимо дали използвате потоци или някакъв друг метод за извличане. Това, което не би трябвало да правите, ако използвате потоци, е да декларирате нова променлива, която да съдържа необходимите стойности, нито да създадете останалите пет плюс реда код в примера по-горе.
Свързани: Как да създавам и изпълнявам операции с масиви в Java
Кодът по-горе дава следния изход в конзолата:
С11
С12
С13
С14
С15
С16
Живот с потоци
При програмирането ефективността говори за получаване на същия резултат със значително по-малко код. Точно това прави потоковият конвейер за програмист. Така че следващия път, когато някой попита: „защо е важно да използвате потоци във вашия проект?“ Просто казано: „потоците поддържат ефективно програмиране“.
Продължавайки с нашия пример по-горе, ето как въвеждането на потоци трансформира цялата програма.
Филтриране и сортиране на стойности с пример за поток
импортиране на java.util. Масиви;
импортиране на java.util. Списък;
публичен клас Main {
публична статична void main (String [] args) {
// декларираме и инициализираме списъка с масиви
Списък 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"
);
// извлича само стойности, които започват с C, сортира ги и ги отпечатва в конзолата.
randomValues.stream (). filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}
Кодът по-горе показва колко мощен е интерфейсът на потока. Той взема списък със стойности на произволен масив и го трансформира в поток с помощта на поток () функция. След това потокът се намалява до списък с масиви, който съдържа необходимите стойности (което е всички стойности, започващи с ° С), използвайки филтър () функция.
Както можете да видите в примера по-горе, ° С стойностите са подредени на случаен принцип в списъка с масиви. Ако трябва да отпечатате потока в този момент от конвейера, стойността С15 ще се отпечата първо. Следователно вид() функцията се въвежда в поточния тръбопровод за пренареждане на новия масив във възходящ ред.
Крайната функция в тръбопровода на потока е a за всеки() функция. Това е терминална функция, която се използва за спиране на тръбопровода на потока и дава следните резултати в конзолата:
С11
С12
С13
С14
С15
С16
Има обширен списък от междинни операции, които могат да бъдат използвани в поточен тръбопровод.
Конвейерът на потока винаги започва с един източник и a поток () функция и винаги завършва с една терминална операция (макар че има няколко различни за изберете между.) Но между тези два раздела има списък от шест междинни операции, които можете използване.
В нашия пример по-горе се използват само две от тези междинни операциифилтър () и вид(). Междинната операция, която изберете, ще зависи от задачите, които искате да изпълните.
Ако някоя от стойностите, които започват с „C“ в нашия списък с масиви по-горе, е с малки букви и ние сме извършили същите междинни операции върху тях, бихме получили следния резултат.
Извършване на операции за филтриране и сортиране с малки букви Пример
импортиране на java.util. Масиви;
импортиране на java.util. Списък;
публичен клас Main {
публична статична void main (String [] args) {
// декларираме и инициализираме списъка с масиви
Списък 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"
);
// извлича само стойности, които започват с C, сортира ги и ги отпечатва в конзолата.
randomValues.stream (). filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}
Кодът по-горе ще генерира следните стойности в конзолата:
С11
С12
С14
С15
Единственият проблем с изхода по-горе е, че той не представя точно всички ° С стойности в нашия списък с масиви. Един добър начин за отстраняване на тази малка грешка е въвеждането на друга междинна операция към поточния тръбопровод; тази операция е известна като карта () функция.
Използване на пример за функция на картата
импортиране на java.util. Масиви;
импортиране на java.util. Списък;
публичен клас Main {
публична статична void main (String [] args) {
// декларираме и инициализираме списъка с масиви
Списък 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"
);
// преобразува всички малки букви в главни букви,
// извлича само стойности, които започват с C, сортира ги и ги отпечатва в конзолата.
randomValues.stream (). map (String:: toUpperCase) .filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}
The карта () функция трансформира обект от едно състояние в друго; в нашия пример по-горе трансформира всички малки букви в списъка с масиви в главни символи.
Поставяне на карта () функция точно преди филтър () функция извлича всички стойности, които започват с ° С от списъка с масиви.
Кодът по-горе дава следния резултат в конзолата, представяйки успешно всички ° С стойности в списъка с масиви.
С11
С12
С13
С14
С15
С16
Останалите три междинни операции, които можете да използвате във вашите приложения, включват:
- надниквам ()
- ограничение ()
- пропуснете ()
Потоците Java 8 улесняват създаването на ефективен код
С потоците Java 8 можете да извличате изключително специфични, подходящи данни от голям източник с един ред код. Стига да включите инициала поток () функция и терминален оператор, можете да използвате всяка комбинация от междинни операции, които осигуряват монтажни изходи за вашата цел.
Ако се чудите за реда на кода, затворен в нашата филтър () функция; тя е известна като „ламбда израз“. Ламбда изразите са друга функция, въведена с Java 8, и тя има много късчета, които може да ви бъдат полезни.
Ако сте програмист на Java и се интересувате да научите повече за ламбдите Java 8, в тази статия ще разгледаме по-отблизо синтаксиса и използването на ламбда.
Прочетете Напред
- Програмиране
- Java
- Уроци за кодиране

Kadeisha Kean е разработчик на софтуер с пълен стек и писател на технически / технологични технологии. Тя има отчетливата способност да опростява някои от най-сложните технологични концепции; производство на материал, който може лесно да бъде разбран от всеки новак в технологията. Тя е запалена по писането, разработването на интересен софтуер и пътуването по света (чрез документални филми).
Абонирайте се за нашия бюлетин
Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и ексклузивни оферти!
Още една стъпка…!
Моля, потвърдете имейл адреса си в имейла, който току-що ви изпратихме.