Primitive Type Streams i Java 8

1. Introduktion

Stream API var en af ​​de vigtigste funktioner tilføjet i Java 8.

Kort sagt giver API'en os mulighed for at behandle samlinger og andre sekvenser af elementer - bekvemt og mere effektivt - ved at levere en deklarativ API.

2. Primitive strømme

Strømme arbejder primært med samlinger af objekter og ikke primitive typer.

Heldigvis at give en måde at arbejde med de tre mest anvendte primitive typer på - int, lang og dobbelt - standardbiblioteket inkluderer tre primitivt specialiserede implementeringer: IntStream, LongStream, og DoubleStream.

Primitive streams er primært begrænset på grund af boksekostnader, og fordi det ikke er 'nyttigt i mange tilfælde at oprette special streams til andre primitiver.

3. Aritmetiske operationer

Lad os starte med et par interessante metoder til stærkt anvendte aritmetiske operationer som f.eks min, maks, sumog gennemsnit:

int [] heltal = nyt int [] {20, 98, 12, 7, 35}; int min = Arrays.stream (heltal) .min () .getAsInt (); // returnerer 7

Lad os nu gå gennem kodestykket ovenfor for at forstå, hvad der foregår.

Vi skabte vores IntStream ved hjælp af java.util.Arrays.stream (int []) og brugte derefter min () metode til at få det laveste heltal som java.util.OptionalInt og til sidst kaldte getAsInt () at få int værdi.

En anden måde at skabe en IntStream bruger IntStream.of (int ...). Det maks () metoden returnerer det største heltal:

int max = IntStream.of (20, 98, 12, 7, 35) .max () .getAsInt (); // returnerer 98

Næste - for at få summen af ​​heltal kalder vi bare for sum() metode, og vi behøver ikke bruge getAsInt () da det allerede returnerer resultatet som et int værdi:

int sum = IntStream.of (20, 98, 12, 7, 35). sum (); // returnerer 172

Vi påberåber os gennemsnit() metode til at få gennemsnittet af heltalværdier, og som vi kan se, skal vi bruge getAsDouble () da den returnerer en værdi af typen dobbelt.

dobbeltgennemsnit = IntStream.of (20, 98, 12, 7, 35) .gennemsnit () .getAsDouble (); // returnerer 34.4

4. Rækkevidde

Vi kan også oprette en IntStream baseret på en rækkevidde:

int sum = IntStream.range (1, 10) .sum (); // returnerer 45 int sum = IntStream.rangeClosed (1, 10) .sum (); // returnerer 55

Som kodeuddraget ovenfor viser, er der to måder at oprette en række heltalværdier på rækkevidde() og rækkevidde lukket ().

Forskellen er, at slutningen af rækkevidde() er eksklusiv, mens det er inkluderet i rækkevidde lukket ().

Område metoder er kun tilgængelige for IntStream og LongStream.

Vi kan bruge rækkevidde som en fancy form af en for-hver løkke:

IntStream.rangeClosed (1, 5) .forEach (System.out :: println);

Hvad der er godt ved at bruge dem som en erstatning for hver løkke er, at vi også kan drage fordel af den parallelle udførelse:

IntStream.rangeClosed (1, 5) .parallel () .forEach (System.out :: println);

Så nyttigt som disse smarte løkker er, er det stadig bedre at bruge de traditionelle for-løkker i stedet for den funktionelle til enkle iterationer på grund af enkelhed, læsbarhed og ydeevne i nogle tilfælde.

5. Boksning og udpakning

Der er tidspunkter, hvor vi har brug for at konvertere primitive værdier til deres indpakningsækvivalenter.

I disse tilfælde kan vi bruge indrammet () metode:

Liste evenInts = IntStream.rangeClosed (1, 10) .filter (i -> i% 2 == 0). Boxed () .collect (Collectors.toList ());

Vi kan også konvertere fra wrapper-klassestrømmen til den primitive strøm:

// returnerer 78 int sum = Arrays.asList (33,45) .stream () .mapToInt (i -> i) .sum ();

Vi kan altid bruge mapToXxx og flatMapToXxx metoder til at skabe primitive strømme.

6. Konklusion

Java Streams er en meget kraftig tilføjelse til sproget. Vi har næppe ridset overfladen af ​​primitive strømme her, men som du allerede kan bruge dem til at være produktive.

Og som altid kan kodeeksempler findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found