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.