Stringoperationer med Java Streams

1. Oversigt

Java 8 har introduceret en ny Strøm API, der lader os behandle data på en deklarativ måde.

I denne hurtige artikel vil vi lære at bruge Strøm API til at opdele et komma-adskilt Snor ind på en liste over Strenge og hvordan man kan deltage i en Snor array i et komma-adskilt Snor.

Vi vil også se på, hvordan man konverterer et strengarray til kort ved hjælp af Strøm API.

Næsten hele tiden står vi over for situationer, hvor vi har brug for at gentage nogle Java-samlinger og filtrer Kollektion baseret på en vis filtreringslogik. I en traditionel tilgang til denne type situation bruger vi masser af sløjfer og hvis-ellers operationer for at få det ønskede resultat.

Hvis du vil læse mere om Strøm API, tjek denne artikel.

2. Deltag i strenge med Strøm API

Lad os bruge Strøm API til at oprette en funktion, der vil slutte sig til en Snor array i et komma-adskilt Snor:

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

Punkter at bemærke her:

  • Det strøm() funktion konverterer enhver Kollektion ind i en datastrøm
  • kort() funktion bruges til at behandle dataene
  • Der er også en anden funktion, der hedder filter(), hvor vi kan inkludere filtreringskriterier

Der kan være scenarier, hvor vi måske ønsker at deltage i en Snor med noget fast præfiks og postfix. Med Strøm API, vi kan gøre det på følgende måde:

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

Som vi kan se i Collectors.joining () metode erklærer vi vores præfiks som ‘[‘ og postfix som ‘]'; deraf genereres Snor vil blive oprettet med erklæret […..] format.

3. Opdeling Strenge Med Strøm API

Lad os nu oprette en funktion, der vil opdele et komma adskilt Snor ind på en liste over Snor ved brug af Strøm API:

offentlig statisk List split (String str) {return Stream.of (str.split (",")) .map (elem -> new String (elem)) .collect (Collectors.toList ()); }

Det er også muligt at konvertere en direkte Snor til en Karakter liste ved hjælp af Strøm API:

offentlig statisk liste splitToListOfChar (String str) {return str.chars () .mapToObj (item -> (char) item) .collect (Collectors.toList ()); }

En interessant kendsgerning at bemærke her er, at tegn () metode konverterer Snor ind i en strøm af Heltal hvor hver Heltal værdi angiver ASCII værdi af hver eneste Char sekvens. Derfor er vi nødt til eksplicit at udskrive kortlæggerobjektet i mapToObj () metode.

4. Snor Array til Kort Med Strøm API

Vi kan også konvertere en Snor array til kort ved hjælp af dele og Collectors.toMap, forudsat at hvert element i arrayet indeholder en nøgleværdienhed sammenkædet af en separator:

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

Her, “:” er nøgleværdiseparator for alle elementerne i strengarray.

Husk at for at undgå kompileringsfejl er vi nødt til at sikre, at koden kompileres ved hjælp af Java 1.8. For at gøre dette skal vi tilføje følgende plugin i pom.xml:

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

5. Testning

Da vi er færdige med at oprette funktionerne, lad os oprette testcases for at kontrollere resultatet.

Lad os først teste vores enkle tilslutningsmetode:

@Test offentlig ugyldighed givenArray_transformedToStream_convertToString () {String [] programmingLanguages ​​= {"java", "python", "nodejs", "ruby"}; String forventning = "java, python, nodejs, ruby"; Strengresultat = JoinerSplitter.join (programmeringLanguages); assertEquals (resultat, forventning); }

Lad os derefter oprette en til at teste vores enkle opdelingsfunktionalitet:

@Test offentlig ugyldighed givenString_transformedToStream_convertToList () {String programmingLanguages ​​= "java, python, nodejs, ruby"; Listeforventning = ny ArrayList (); expectation.add ("java"); expectation.add ("python"); expectation.add ("nodejs"); expectation.add ("ruby"); Liste resultat = JoinerSplitter.split (programmeringLanguages); assertEquals (resultat, forventning); }

Lad os endelig teste vores Snor array to map-funktionalitet:

@Test offentlig ugyldighed givenStringArray_transformedToStream_convertToMap () {String [] programming_languages ​​= new String [] {"sprog: java", "os: linux", "editor: emacs"}; Kortforventning = ny HashMap (); expectation.put ("sprog", "java"); expectation.put ("os", "linux"); expectation.put ("editor", "emacs"); Kortresultat = JoinerSplitter.arrayToMap (programmering_sprog); assertEquals (resultat, forventning); }

På samme måde er vi nødt til at oprette resten af ​​testsagerne.

6. Konklusion

Strøm API giver os sofistikerede databehandlingsteknikker. Denne nye måde at skrive kode på er meget effektiv med hensyn til heaphukommelsesstyring i et miljø med flere tråde.

Som altid er den fulde kildekode tilgængelig på Github.