Прирачник за струи за Java 8 со примери за кодови

Во овој пост на блогот, ќе разговараме за одликите на Java 8 Streams и ќе обезбедиме многу различни примери со кодови.

Java Streams носат функционално програмирање во java и тие се поддржани почнувајќи од java 8, така што ако имате постара верзија на java, тогаш мора да ја надградите java 8 за да користите Java Streams.



Зошто да користите Java streams?

Некои од предностите на потоците:


  • Потоците ќе ве направат поефикасен Java програмер (ќе видите дека со многу малку линии на код, всушност можете да постигнете многу со користење на потоци).
  • Тие многу користат ламбда изрази кои се вид на функции за еднократна употреба.
  • ParallelStreams овозможува операции со повеќе нишки за големи групи на податоци многу лесно.


Гасовод за потоци

Во повеќето случаи, струјниот гасовод се состои од а

  • извор (од каде течат податоците)
  • проследено со нула или повеќе средни операции
  • и еден работење со терминал

Јава потоци - филтер, мапа, намалување


Изворот ќе проследува прилив на елементи.

Тој проток на елементи може да се филтрира, сортира или може да се мапира или да се применат различни други серии на операции на секој елемент.

На крајот, може да се собере или намали или да се изврши некоја друга терминална операција, но да се изврши само една терминална операција.

Извор на поток

Извор на поток може да доаѓаат од колекции, списоци, множества, низи од int, longs, double, strings, итн.


Текови на операциите

Операции во тек се или средни или терминални:

  • Средно работење како што се филтер, мапа или сортирање, враќање на поток за да можеме да синџирираме повеќе интермедијарни операции.
  • Операции со терминал примаат поток и тие можат или да се вратат неважечки или можат да вратат резултат без пренос како што е намалување, на пр. намалете ги ставките на список.

Средно работење

  • Дозволено е нула или повеќе средни операции.
  • Редот е важен; за големи групи на податоци: прво филтрирај потоа сортирајте или мапирајте.
  • За многу големи збирки на податоци, ParallelStream за да овозможиме повеќе нишки.

Некои од средните операции вклучуваат:

  • било кој натпревар ()
  • различни()
  • филтер ()
  • findFirst ()
  • рамна мапа ()
  • мапа ()
  • прескокни ()
  • подредени ()

Операции со терминал

Дозволено е само едно работење со терминал.

  • forEach ја применува истата функција на секој елемент, на пример, отпечатете го секој елемент.
  • колекција ги зачувува сите елементи во колекција или список или низа.
  • сите други опции го намалуваат преносот на еден елемент на резиме.

Неколку примери за намалување на функциите се:


  • брои ()
  • максимум ()
  • мин ()
  • намали ()


Примери за кодови на Java Java

Сега, да ги видиме горенаведените концепти во примери со кодови.

Целосен поток

Првиот пример е само цел проток. Toе создадеме интегрален поток со користење на IntStream класа и нејзината функција опсег што ни дава опсег на цели броеви.

forEach е наша терминална работа. За секоја ставка, само ќе ја испечатиме.

import java.io.IOException; import java.util.stream.IntStream; public class JavaStreams {
public static void main(String[] args) throws IOException {
IntStream

.range(1, 10)

.forEach(System.out::print);
System.out.println();
} }

Излез:


123456789

Цел број поток со прескок

Вториот пример користи цел проток, но додадовме skip() еве, затоа, во овој случај, ќе ги прескокнеме првите 5 елементи од нашиот поток.

Ова ќе биде само елементи за печатење од 6 до 9. Ние исто така користиме едноставен ламбда израз за печатење на артиклот

import java.io.IOException; import java.util.stream.IntStream; public class JavaStreams {
public static void main(String[] args) throws IOException {
IntStream

.range(1, 10)

.skip(5)

.forEach(x -> System.out.println(x));
System.out.println();
} }

Излез:

6 7 8 9

Цел интегрален тек со Сум

Третиот пример, повторно го користиме IntStream сепак, да го создадеме нашиот прилив на предмети, го ставаме внатре во println() изјава како параметар за линијата за печатење.


Она што ќе го испечатиме е само збир од опсег 1 до 5 со други зборови, 1 2 3 & 4 ќе се отпечати само збирот на тие броеви:

import java.io.IOException; import java.util.stream.IntStream; public class JavaStreams {
public static void main(String[] args) throws IOException {
System.out.println(
IntStream

.range(1, 5)

.sum());
System.out.println();
} }

Излез:

10

Тек на

Следниот пример го користи Stream.of функција, што е навистина корисно затоа што можете да проследувате цели броеви, вредности на подвижна точка или жици или дури и предмети.

Во овој пример, ние ќе направиме прав азбучен ред, тогаш ќе ја најдеме првата ставка со помош на findFirst() функција. Потоа, ние само ја отпечатиме првата ставка во списокот.

import java.io.IOException; import java.util.stream.Stream; public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream.of('Ava', 'Aneri', 'Alberto')

.sorted()

.findFirst()

.ifPresent(System.out::println);
} }

Излез

Alberto

Проследувајте од низата, сортирајте, филтрирајте и печатете

Во нашиот следен пример, ќе проследуваме од низа. Потоа, ќе сортираме, филтрираме и потоа печатиме.

Еве, ќе филтрираме само ставки што започнуваат со s.

Ние користиме ламбда израз што внесува X што е секое име и потоа проверува кои започнуваат со буква s и ќе ги пренесе тие.

Тогаш ќе ги сортираме, а потоа за секоја ставка што ќе го помине тој вид ќе го испечатиме.

import java.io.IOException; import java.util.Arrays; public class JavaStreams {
public static void main(String[] args) throws IOException {
String[] names = {'Al', 'Ankit', 'Kushal', 'Brent', 'Sarika', 'amanda', 'Hans', 'Shivika', 'Sarah'};
Arrays.stream(names)


.filter(x -> x.startsWith('S'))


.sorted()


.forEach(System.out::println);
} }

Излез:

Sarah Sarika Shivika

Просек на низа со цели броеви

Ајде сега да погледнеме како можеме да го земеме просекот на квадрати од низата int.

Тука, ние ги користиме Arrays.stream() функција за проследување на цели броеви и тогаш ќе ги искористиме map() да ја мапира секоја ставка секој цел број на својот квадрат.

import java.util.Arrays; public class JavaStreams {
public static void main(String[] args) {
Arrays.stream(new int[] {2, 4, 6, 8, 10})


.map(x -> x * x)


.average()


.ifPresent(System.out::println);
} }

Излез:

44.0

Забележете дека печати двојно наместо цел број.

Проследувајте од списокот, филтрирајте и печатете

Во овој пример, ние ќе проследуваме од список, ќе ги филтрираме тие ставки и потоа ќе печатиме.

Забележете дека во рамките на map() функција, ќе ги претвориме сите имиња во мали букви.

import java.util.Arrays; import java.util.List; public class JavaStreams {
public static void main(String[] args) {
List people = Arrays.asList('Al', 'Ankit', 'Brent', 'Sarika', 'amanda', 'Hans', 'Shivika', 'Sarah');
people


.stream()


.map(String::toLowerCase)


.filter(x -> x.startsWith('a'))


.forEach(System.out::println);
} }

Излез:

al ankit amanda

Можеме да видиме дека имаме три имиња кои започнуваат со a и сите се со мали букви.

Проследувајте редови од текстуална датотека, сортирајте, филтрирајте и печатете

Во нашиот следен пример, ќе проследуваме редови од текстуална датотека. Toе сортираме, филтрираме и печатиме.

Да претпоставиме дека имаме датотека наречена bands.txt со содржина прикажана подолу:

Rolling Stones Lady Gaga Jackson Browne Maroon 5 Arijit Singh Elton John John Mayer CCR Eagles Pink Aerosmith Adele Taylor Swift

Toе ги користиме Files.lines() да создадеме наш поток што ќе ни даде поток на низа за секоја линија од датотеката.

Откако ќе го имаме нашиот проток, ќе ги средиме и ќе ги филтрираме предметите што се поголеми од 13 карактери, а потоа ќе ги испечатиме останатите ставки.

На крај, мора да ја затвориме датотеката за да ги направиме bands.close.

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream; public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream bands = Files.lines(Paths.get('bands.txt'));
bands


.sorted()


.filter(x -> x.length() > 13)


.forEach(System.out::println);
bands.close();
} }

Излез:

Jackson Browne Rolling Stones

Добиваме два бенда кои имаат повеќе од 13 карактери.

Проследувајте редови од текстуална датотека и зачувајте во Список

За овој пример, ќе ја користиме истата текстуална датотека како погоре.

Ние сакаме да ги филтрираме елементите што содржат букви jit, користејќи x.contains() што е само низа функција.

Користење на .collect() ги додаваме сите со букви jit до список.

Откако ќе излеземе со списокот, тогаш можеме да го користиме forEach оператор за печатење на артиклите.

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; public class JavaStreams {
public static void main(String[] args) throws IOException {
List bands2 = Files.lines(Paths.get('bands.txt'))


.filter(x -> x.contains('jit'))


.collect(Collectors.toList());
bands2.forEach(x -> System.out.println(x));
} }

Излез:

Arijit Singh

Проследувајте редови од CSV-датотеката и бројте

Во овој пример, ние проследуваме редови од CSV-датотека и ќе ги изброиме добрите редови.

Да претпоставиме дека имаме датотека наречена data.txt со следниве содржини:

A,12,3.7 B,17,2.8 C,14,1.9 D,23,2.7 E F,18,3.4

Еве, редот Е нема податоци, затоа сакаме да го исклучиме тој од нашиот поток.

Во следниот код, ќе читаме во секој ред, тогаш треба да се поделиме со запирки во низа, така што секој ред ќе стане низа од ставки.

Потоа, нанесуваме филтер за да ги филтрираме редовите што немаат три ставки.

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream; public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream rows1 = Files.lines(Paths.get('data.txt'));
int rowCount = (int)rows1


.map(x -> x.split(','))


.filter(x -> x.length == 3)


.count();
System.out.println(rowCount + ' rows.');
rows1.close();
} }

Излез:

5 rows

Намалување - збир

Овој пример ви покажува како да користите редукција. Toе намалиме на сума. Тука, имаме двоен проток со користење на Stream.of() функција. Дефиниравме три двојници во три различни аргументи и ќе ја користиме функцијата за намалување.

import java.util.stream.Stream; public class JavaStreams {
public static void main(String[] args) {
double total = Stream.of(7.3, 1.5, 4.8)


.reduce(0.0, (Double a, Double b) -> a + b);
System.out.println('Total = ' + total);
} }

Излез:

13.600000000000001