Tekenreeksbewerkingen met Java-streams

1. Overzicht

Java 8 heeft een nieuw Stroom API waarmee we gegevens op een declaratieve manier kunnen verwerken.

In dit korte artikel leren we hoe we de Stroom API om een ​​door komma's gescheiden Draad in een lijst met Snaren en hoe je lid wordt van een Draad array in een door komma's gescheiden Draad.

We zullen ook bekijken hoe u een string-array kunt converteren naar kaart met Stroom API.

Bijna altijd worden we geconfronteerd met situaties waarin we enkele moeten herhalen Java-verzamelingen en filter de Verzameling gebaseerd op een aantal filterlogica. In een traditionele benadering voor dit soort situaties zouden we veel lussen en if-else-bewerkingen gebruiken om het gewenste resultaat te krijgen.

Als je meer wilt lezen over de Stroom API, bekijk dit artikel.

2. Strings verbinden met de Stroom API

Laten we de Stroom API om een ​​functie te maken die zou worden toegevoegd aan een Draad array in een door komma's gescheiden Draad:

openbare statische String-join (String [] arrayOfString) {return Arrays.asList (arrayOfString) .stream () //. map (...) .collect (Collectors.joining (",")); }

Punten om hier op te merken:

  • De stroom() functie converteert elke Verzameling in een stroom gegevens
  • kaart() functie wordt gebruikt om de gegevens te verwerken
  • Er is ook nog een andere functie, genaamd filter(), waar we filtercriteria kunnen opnemen

Er kunnen scenario's zijn, waarbij we ons misschien willen aansluiten bij een Draad met een vaste prefix en postfix. Met de Stroom API kunnen we dat op de volgende manier doen:

openbare statische String joinWithPrefixPostfix (String [] arrayOfString) {return Arrays.asList (arrayOfString) .stream () //. map (...) .collect (Collectors.joining (",", "[", "]") ); }

Zoals we kunnen zien in de Collectors.joining () methode, we declareren ons voorvoegsel als ‘[‘ en postfix als ‘]'; vandaar de gegenereerde Draad wordt gemaakt met gedeclareerd […..] formaat.

3. Splitsen Snaren Met Stroom API

Laten we nu een functie maken, die een door komma gescheiden scheiding zou splitsen Draad in een lijst met Draad gebruik makend van Stroom API:

openbare statische lijst split (String str) {return Stream.of (str.split (",")) .map (elem -> nieuwe String (elem)) .collect (Collectors.toList ()); }

Het is ook mogelijk om een Draad naar een Karakter lijst met behulp van de Stroom API:

openbare statische lijst splitToListOfChar (String str) {return str.chars () .mapToObj (item -> (char) item) .collect (Collectors.toList ()); }

Een interessant feit om hier op te merken is dat de tekens () methode converteert het Draad in een stroom van Geheel getal waar elk Geheel getal waarde geeft de ASCII waarde van elk Char volgorde. Daarom moeten we het mapper-object expliciet in het mapToObj () methode.

4. Draad Array naar Kaart Met Stroom API

We kunnen ook een Draad array om toe te wijzen met splitsen en Collectors.toMap, op voorwaarde dat elk item in de array een sleutel / waarde-entiteit bevat die is samengevoegd met een scheidingsteken:

openbare statische kaart arrayToMap (String [] arrayOfString) {return Arrays.asList (arrayOfString) .stream () .map (str -> str.split (":")) .collect (toMap (str -> str [0], str -> str [1])); }

Hier, “:” is het sleutel-waarde scheidingsteken voor alle elementen in de String-array.

Onthoud dat om compilatiefouten te voorkomen, we ervoor moeten zorgen dat de code wordt gecompileerd met Java 1.8. Om dit te doen, moeten we de volgende plug-in toevoegen aan het pom.xml:

   org.apache.maven.plugins maven-compiler-plugin 3.3 1.8 1.8 

5. Testen

Aangezien we klaar zijn met het maken van de functies, gaan we testcases maken om het resultaat te verifiëren.

Laten we eerst onze eenvoudige verbindingsmethode testen:

@Test openbare leegte gegevenArray_transformedToStream_convertToString () {String [] programmingLanguages ​​= {"java", "python", "nodejs", "ruby"}; String verwachting = "java, python, nodejs, ruby"; String resultaat = JoinerSplitter.join (programmingLanguages); assertEquals (resultaat, verwachting); }

Laten we vervolgens nog een maken om onze eenvoudige splitsfunctie te testen:

@Test openbare leegte gegevenString_transformedToStream_convertToList () {String programmingLanguages ​​= "java, python, nodejs, ruby"; Lijst verwachting = nieuwe ArrayList (); verwachting.add ("java"); verwachting.add ("python"); verwachting.add ("nodejs"); verwachting.add ("robijn"); Lijstresultaat = JoinerSplitter.split (programmingLanguages); assertEquals (resultaat, verwachting); }

Laten we tot slot onze Draad array om functionaliteit in kaart te brengen:

@Test openbare leegte gegevenStringArray_transformedToStream_convertToMap () {String [] programming_languages ​​= nieuwe String [] {"taal: java", "os: linux", "editor: emacs"}; Kaartverwachting = nieuwe HashMap (); verwachting.put ("taal", "java"); verwachting.put ("os", "linux"); verwachting.put ("editor", "emacs"); Kaartresultaat = JoinerSplitter.arrayToMap (programmeertalen); assertEquals (resultaat, verwachting); }

Op dezelfde manier moeten we de rest van de testcases maken.

6. Conclusie

Stroom API biedt ons geavanceerde gegevensverwerkingstechnieken. Deze nieuwe manier van code schrijven is zeer efficiënt in termen van heap-geheugenbeheer in een multi-threaded omgeving.

Zoals altijd is de volledige broncode beschikbaar op Github.