Vodič za Java 8 strujanja s primjerima koda

U ovom postu na blogu razgovarat ćemo o značajkama Java 8 Streams i pružiti puno različitih primjera koda.

Java Streamovi donose funkcionalno programiranje u javu i podržani su počevši od jave 8, pa ako imate stariju verziju jave, morate nadograditi na java 8 da biste koristili Java Streams.

Zašto koristiti Java Streamove?

Neke od prednosti potoka:

  • Streamovi će vas učiniti učinkovitijim java programatorom (vidjet ćete da s vrlo malo redaka koda zapravo možete postići prilično puno pomoću streamova).
  • Često koriste lambda izraze koji su svojevrsne jednokratne funkcije.
  • ParallelStreams omogućuje vrlo jednostavne operacije s više niti za velike skupove podataka.

Cjevovod potoka

U većini slučajeva cjevovod potoka sastoji se od a

  • izvor (odakle istječu vaši podaci)
  • nakon čega slijedi nula ili više posredne operacije
  • i jedan rad terminala

Java tokovi - filtriranje, mapiranje, smanjenje

Izvor će strujati tok elemenata.



Taj tok elemenata može se filtrirati, razvrstati ili mapirati ili primijeniti različite nizove operacija na svaki element.

Na kraju se može ili prikupiti ili smanjiti ili izvršiti neka druga operacija terminala, ali izvodi se samo jedna operacija terminala.

Izvor streama

Izvor streama može doći iz zbirki, popisa, skupova, nizova int, longs, double, stringova itd.

Stream Operacije

Stream operacije su ili srednji ili terminalni:

  • Posredničke operacije kao što su filtriranje, mapiranje ili sortiranje, vraćaju tok tako da možemo povezati više posrednih operacija.
  • Terminalne operacije primaju stream i mogu ili vratiti void ili mogu vratiti rezultat koji nije stream poput smanjenja, na pr. svesti stavke na popis.

Srednje operacije

  • Dopuštene su nula ili više posrednih operacija.
  • Red je važan; za velike skupove podataka: prvo filtrirajte zatim sortirati ili mapirati.
  • Za vrlo velike skupove podataka nam ParallelStream omogućuje višestruke niti.

Neke od posredničkih operacija uključuju:

  • anyMatch ()
  • različit ()
  • filtar()
  • findFirst ()
  • plosnata karta ()
  • karta()
  • preskočiti()
  • sortirano ()

Terminalske operacije

Dopuštena je samo jedna operacija terminala.

  • forEach primjenjuje istu funkciju na svaki element, na primjer ispisuje svaki element.
  • collect sprema sve elemente u zbirku ili na popis ili u niz.
  • sve ostale opcije smanjuju tok na jedan sažeti element.

Neki primjeri funkcija smanjenja su:

  • računati()
  • maks. ()
  • min ()
  • smanjiti()

Primjeri koda Java Streams

Pogledajmo sada gornje koncepte u primjerima koda.

Cijeli tok

Prvi je primjer samo cjelobrojni tok. Stvorit ćemo cjelobrojni tok pomoću IntStream klase i funkcije raspona koja nam daje raspon cijelih brojeva.

The forEach je naša operacija terminala. Za svaku ćemo je stavku samo isprintati.

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();
} }

Izlaz:

123456789

Cjeloviti tok sa preskoči

Drugi primjer koristi cjelobrojni tok, ali dodali smo skip() ovdje, pa ćemo u ovom slučaju preskočiti prvih 5 elemenata našeg streama.

Ovo će biti samo ispisivanje elemenata od 6 do 9. Za ispis predmeta koristimo i jednostavni lambda izraz

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();
} }

Izlaz:

6 7 8 9

Cijeli tok sa zbrojem

Treći primjer, opet koristimo IntStream kako bismo stvorili naš tok objekata, stavili smo to unutar println() izraz kao parametar za ispisni redak.

Ono što ćemo ispisati je samo zbroj od raspona 1 do 5, drugim riječima, 1 2 3 i 4, ispisat će samo zbroj tih brojeva:

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();
} }

Izlaz:

10

Stream.of

Sljedeći primjer koristi Stream.of funkcija, što je vrlo zgodno jer možete strujati cijele brojeve, vrijednosti s pomičnim zarezom ili nizove ili čak objekte.

U ovom ćemo primjeru izvesti ravno abecedno sortiranje, a zatim ćemo pronaći prvu stavku pomoću findFirst() funkcija. Zatim samo ispisujemo prvu stavku s popisa.

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);
} }

Izlaz

Alberto

Struji iz niza, sortiraj, filtriraj i ispisuj

U sljedećem ćemo primjeru strujati iz niza. Tada ćemo sortirati, filtrirati i zatim ispisati.

Ovdje ćemo filtrirati stavke samo one koje počinju sa s.

Koristimo lambda izraz koji uzima X što je svako ime, a zatim provjerava koja počinju slovom s i to će proslijediti dalje.

Zatim ćemo ih razvrstati, a zatim ćemo za svaku stavku koja prođe tu sortu ispisati.

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);
} }

Izlaz:

Sarah Sarika Shivika

Prosjek cjelovitog niza

Sada pogledajmo kako možemo uzeti prosjek kvadrata int niza.

Ovdje koristimo Arrays.stream() funkcija za strujanje cijelih brojeva i tada ćemo koristiti map() za mapiranje svake stavke svake cijele vrijednosti na svoj kvadrat.

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);
} }

Izlaz:

44.0

Imajte na umu da se umjesto cijelog broja ispisuje dvostruko.

Stream s popisa, filtrirajte i ispišite

U ovom ćemo primjeru strujati sa popisa, filtrirati te stavke i zatim ispisati.

Imajte na umu da unutar map() funkcija, pretvorit ćemo sva imena u mala slova.

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);
} }

Izlaz:

al ankit amanda

Možemo vidjeti da imamo tri imena koja počinju sa a i svi su malim slovima.

Strimujte retke iz tekstualne datoteke, sortirajte, filtrirajte i ispišite

U sljedećem ćemo primjeru strujati retke iz tekstualne datoteke. Sortirat ćemo, filtrirati i ispisati.

Pretpostavimo da imamo datoteku koja se zove bands.txt sa sadržajem prikazanim u nastavku:

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

Koristit ćemo Files.lines() stvoriti naš tok koji će nam dati tok niza za svaki redak datoteke.

Nakon što stvorimo stream, sortirat ćemo ih i filtrirati ćemo stavke veće od 13 znakova, a zatim ispisati preostale stavke.

I na kraju, moramo zatvoriti datoteku pa 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();
} }

Izlaz:

Jackson Browne Rolling Stones

Dobili smo dva benda koji imaju više od 13 znakova.

Strimujte retke iz tekstualne datoteke i spremite ih na popis

Za ovaj ćemo primjer upotrijebiti istu tekstualnu datoteku kao gore.

Želimo filtrirati stavke koje sadrže slova jit, pomoću x.contains() što je samo funkcija niza.

Korištenje .collect() zbrajamo sve one sa slovima jit na popis.

Jednom kad imamo popis, možemo koristiti forEach operater za ispis predmeta.

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));
} }

Izlaz:

Arijit Singh

Struji redove iz CSV datoteke i broji

U ovom primjeru strujimo retke iz CSV datoteke i brojat ćemo dobre retke.

Pretpostavimo da imamo datoteku koja se zove data.txt sa sljedećim sadržajima:

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

Ovdje redak E nema podataka, pa ga želimo izuzeti iz svog toka.

U sljedećem ćemo kodu čitati u svakom retku, a zatim trebamo razdvojiti zareze u niz, tako da će svaki redak postati niz stavki.

Zatim primjenjujemo filtar za filtriranje redaka koji nemaju tri stavke.

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();
} }

Izlaz:

5 rows

Smanjenje - zbroj

Ovaj primjer pokazuje kako se koristi redukcija. Smanjit ćemo na zbroj. Ovdje imamo dvostruki tok koji koristi Stream.of() funkcija. U tri različita argumenta definirali smo tri dvojnika i koristit ćemo funkciju redukcije.

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);
} }

Izlaz:

13.600000000000001