String operacije s Java Streamsom

1. Pregled

Java 8 predstavila je novu Stream API koji nam omogućuje obradu podataka na deklarativni način.

U ovom brzom članku naučili bismo kako koristiti Stream API za razdvajanje zareza Niz na popis Žice i kako se pridružiti a Niz niz u odvojene zarezima Niz.

Također ćemo pogledati kako pretvoriti niz niza u mapu pomoću Stream API.

Gotovo cijelo vrijeme suočavamo se sa situacijama, kada neke moramo ponoviti Zbirke Java i filtrirati Kolekcija na temelju neke logike filtriranja. U tradicionalnom pristupu za ovu vrstu situacije, koristili bismo puno petlji i if-else operacija da bismo dobili željeni rezultat.

Ako želite pročitati više o Stream API, provjerite ovaj članak.

2. Spajanje nizova s Stream API

Iskoristimo Stream API za stvaranje funkcije koja bi se pridružila a Niz niz u odvojene zarezima Niz:

javni statički String join (String [] arrayOfString) {return Arrays.asList (arrayOfString) .stream () //. map (...) .collect (Collectors.joining (",")); }

Ovdje treba napomenuti:

  • The stream () funkcija pretvara bilo koju Kolekcija u tok podataka
  • karta() funkcija koristi se za obradu podataka
  • Postoji i druga funkcija, nazvana filtar(), gdje možemo uključiti kriterije filtriranja

Mogu biti scenariji u kojima bismo se mogli pridružiti Niz s nekim fiksnim prefiksom i postfiksom. Uz Stream API to možemo učiniti na sljedeći način:

javni statički niz joinWithPrefixPostfix (String [] arrayOfString) {return Arrays.asList (arrayOfString) .stream () //. map (...) .collect (Collectors.joining (",", "[", "]")) ); }

Kao što vidimo u Kolekcionari.joining () metodu, svoj prefiks deklariramo kao ‘[‘ a postfix kao ‘]'; dakle generirani Niz stvorit će se s prijavljenim […..] format.

3. Cijepanje Žice S Stream API

Ajmo sada stvoriti funkciju koja će razdvojiti zarez Niz na popis Niz koristeći Stream API:

javni statički podijeljeni popis (String str) {return Stream.of (str.split (",")) .map (elem -> novi String (elem)) .collect (Collectors.toList ()); }

Također je moguće izravno pretvoriti a Niz do a Lik popis pomoću Stream API:

javni statički popis splitToListOfChar (String str) {return str.chars () .mapToObj (item -> (char) item) .collect (Collectors.toList ()); }

Ovdje je potrebno primijetiti jednu zanimljivu činjenicu da znakovi () metoda pretvara Niz u potok Cijeli broj gdje svaki Cijeli broj vrijednost označava ASCII vrijednost svakog i svakog Char slijed. Zato moramo izričito otkucati mapper objekt u mapToObj () metoda.

4. Niz Niz do Karta S Stream API

Također možemo pretvoriti a Niz polje za mapiranje pomoću podjela i Kolekcionari.toMap, pod uvjetom da svaka stavka u nizu sadrži entitet ključ / vrijednost spojen separatorom:

javna statička karta arrayToMap (String [] arrayOfString) {return Arrays.asList (arrayOfString) .stream () .map (str -> str.split (":")) .collect (toMap (str -> str [0], str -> str [1])); }

Ovdje, “:” je separator ključ / vrijednost za sve elemente u nizu String.

Imajte na umu da, kako bismo izbjegli pogrešku pri kompilaciji, moramo osigurati da se kod kompajlira pomoću Jave 1.8. Da bismo to učinili, trebamo dodati sljedeći dodatak u pom.xml:

   org.apache.maven.plugins maven-compiler-plugin 3,3 1,8 1,8 

5. Ispitivanje

Budući da smo završili sa stvaranjem funkcija, stvorimo test slučajeve kako bismo provjerili ishod.

Prvo, testirajmo našu jednostavnu metodu spajanja:

@Test javna praznina givenArray_transformedToStream_convertToString () {String [] programmingLanguages ​​= {"java", "python", "nodejs", "ruby"}; Očekivanje niza = "java, python, nodejs, ruby"; Rezultat niza = JoinerSplitter.join (programiranjejezika); assertEquals (rezultat, očekivanje); }

Dalje, kreirajmo još jedan za testiranje naše jednostavne funkcionalnosti razdvajanja:

@Test javna praznina givenString_transformedToStream_convertToList () {String programmingLanguages ​​= "java, python, nodejs, ruby"; Očekivanje popisa = novi ArrayList (); expectation.add ("java"); expectation.add ("python"); expectation.add ("nodejs"); expectation.add ("rubin"); Rezultat popisa = JoinerSplitter.split (programiranje jezika); assertEquals (rezultat, očekivanje); }

Napokon, testirajmo naše Niz niz za mapiranje funkcionalnosti:

@Test javna praznina givenStringArray_transformedToStream_convertToMap () {String [] programming_languages ​​= new String [] {"language: java", "os: linux", "editor: emacs"}; Očekivanje karte = novi HashMap (); expectation.put ("jezik", "java"); expectation.put ("os", "linux"); expectation.put ("editor", "emacs"); Rezultat karte = JoinerSplitter.arrayToMap (jezici_programiranja); assertEquals (rezultat, očekivanje); }

Na isti način trebamo stvoriti i ostatak test slučajeva.

6. Zaključak

Stream API nam pruža sofisticirane tehnike obrade podataka. Ovaj novi način pisanja koda vrlo je učinkovit u smislu upravljanja hrpom memorije u okruženju s više niti.

Kao i uvijek, puni izvorni kod dostupan je na Githubu.