Java 8 straumkennsla með dæmum um kóða

Í þessari bloggfærslu ætlum við að ræða Java 8 Streams eiginleika og veita fullt af mismunandi dæmum um kóða.

Java Streams koma með hagnýtur forritun til java og þeir eru studdir frá og með java 8 þannig að ef þú ert með eldri útgáfu af java þá þarftu að uppfæra í java 8 til að nota Java Streams.



Af hverju að nota Java Streams?

Sumir af kostum lækja:


  • Straumur mun gera þig að skilvirkari Java forritara (þú munt sjá að með örfáum línum af kóða geturðu raunverulega náð talsvert miklu með því að nota læki).
  • Þeir nota mikið lambda tjáningu sem eru eins konar einnota aðgerðir.
  • ParallelStreams gerir mjög þægilegan rekstur fyrir stór gagnasett mjög auðveldan.


Straumleiðsla

Í flestum tilvikum samanstendur straumleiðsla af a

  • heimild (þar sem gögnin þín streyma út úr)
  • fylgt eftir með núll eða meira millirekstur
  • og einn flugstöðvarrekstur

Java Streams - Sía, kort, draga úr


Uppsprettan á eftir að streyma straum af frumefnum.



Sá straumur þátta er hægt að sía, raða, eða það er hægt að kortleggja eða nota mismunandi aðrar aðgerðir til hvers þáttar.

Í lokin er annaðhvort hægt að safna því eða minnka eða með einhverri annarri flugstöðvaraðgerð en aðeins ein flugstöðvaraðgerð er framkvæmd.

Stream Source

Straumgjafi getur komið úr söfnum, listum, settum, fylkjum af int, löngum, tvöföldum, strengjum osfrv.


Straumaðgerðir

Straumaðgerðir eru annað hvort millistig eða flugstöð:

  • Milliaðgerðir svo sem eins og sía, korta eða raða skila straumi svo við getum hlekkjað margar milliliðaaðgerðir.
  • Flugstöðvarrekstur fá straum og þeir geta annað hvort skilað ógildu eða þeir geta skilað niðurstöðu sem ekki er straumur eins og lækkun, t.d. fækka atriðum í lista.

Milliaðgerðir

  • Núll eða fleiri milliliðaaðgerðir eru leyfðar.
  • Pöntun skiptir máli; fyrir stór gagnasöfn: sía fyrst síðan raða eða kortleggja.
  • Fyrir mjög stór gagnasett notum við ParallelStream til að virkja marga þræði.

Sumar millistigsaðgerðirnar eru:

  • anyMatch ()
  • greinilegur ()
  • sía ()
  • finnaFyrsta ()
  • flatmap ()
  • kort ()
  • sleppa ()
  • raðað ()

Flugstöðvarrekstur

Aðeins er leyfilegt að fá eina flugstöðvaraðgerð.

  • forEach notar sömu aðgerð fyrir hvern þátt, til dæmis að prenta hvern þátt.
  • safna vistar alla þætti í safn eða lista eða fylki.
  • allir aðrir möguleikar draga strauminn niður í einn yfirlitsþátt.

Nokkur dæmi um fækkunaraðgerðir eru:


  • telja ()
  • hámark ()
  • mín ()
  • draga úr ()


Dæmi um Java Streams kóða

Nú skulum við sjá ofangreind hugtök í dæmum um kóða.

Heildarstraumur

Fyrsta dæmið er bara heiltala. Við ætlum að búa til heiltölustraum með IntStream bekk og sviðsaðgerð hans sem gefur okkur fjölda heiltala.

The forEach er flugstöðvarrekstur okkar. Fyrir hvert atriði ætlum við bara að prenta það út.

import java.io.IOException; import java.util.stream.IntStream; public class JavaStreams {
public static void main(String[] args) throws IOException {
IntStream

.range(1, 10)

.forEach(System.out::print);
System.out.println();
} }

Framleiðsla:


123456789

Heildarstraumur með Skip

Annað dæmið notar heiltölustraum en við bættum við skip() hér, þannig að í þessu tilfelli ætlum við að sleppa fyrstu 5 þáttunum í straumnum okkar.

Þetta mun aðeins vera prentþættir 6 til 9. Við notum líka einfalda lambatjáningu til að prenta hlutinn

import java.io.IOException; import java.util.stream.IntStream; public class JavaStreams {
public static void main(String[] args) throws IOException {
IntStream

.range(1, 10)

.skip(5)

.forEach(x -> System.out.println(x));
System.out.println();
} }

Framleiðsla:

6 7 8 9

Heildarstraumur með Sum

Þriðja dæmið, við notum aftur IntStream til að búa til straum af hlutum hins vegar setjum við það inni í println() yfirlýsingu sem breytu fyrir prentlínuna.


Það sem við ætlum að prenta er bara summan frá bilinu 1 til 5 með öðrum orðum, 1 2 3 & 4 það mun aðeins prenta summan af þessum tölum:

import java.io.IOException; import java.util.stream.IntStream; public class JavaStreams {
public static void main(String[] args) throws IOException {
System.out.println(
IntStream

.range(1, 5)

.sum());
System.out.println();
} }

Framleiðsla:

10

Stream.of

Næsta dæmi notar Stream.of virka, sem er virkilega handhægt vegna þess að þú getur streymt heiltölum, gildi flotpunkta eða strengi eða jafnvel hlutum.

Í þessu dæmi ætlum við bara að gera beina stafrófsröð og þá munum við finna fyrsta hlutinn með findFirst() virka. Síðan prentum við bara fyrsta hlutinn á listanum.

import java.io.IOException; import java.util.stream.Stream; public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream.of('Ava', 'Aneri', 'Alberto')

.sorted()

.findFirst()

.ifPresent(System.out::println);
} }

Framleiðsla

Alberto

Streymdu frá Array, raðaðu, síaðu og prentaðu

Í næsta dæmi okkar ætlum við að streyma úr fylki. Svo ætlum við að flokka, sía og prenta.

Hér ætlum við að sía aðeins út hluti sem byrja á s.

Við notum lambadjáningu sem tekur inn X sem er hvert nafn og síðan kannar það hverjir byrja á bókstöfum s og það mun koma þeim áfram.

Síðan ætlum við að raða þeim og síðan ætlum við að prenta það fyrir hvern hlut sem fer framhjá þeirri tegund.

import java.io.IOException; import java.util.Arrays; public class JavaStreams {
public static void main(String[] args) throws IOException {
String[] names = {'Al', 'Ankit', 'Kushal', 'Brent', 'Sarika', 'amanda', 'Hans', 'Shivika', 'Sarah'};
Arrays.stream(names)


.filter(x -> x.startsWith('S'))


.sorted()


.forEach(System.out::println);
} }

Framleiðsla:

Sarah Sarika Shivika

Meðaltal Heildar Array

Við skulum nú skoða hvernig við getum tekið meðaltal ferninga innan fylkis.

Hér notum við Arrays.stream() virka til að streyma heiltölurnar og þá ætlum við að nota map() til að kortleggja hvern hlut hverja heiltölu á ferning sinn.

import java.util.Arrays; public class JavaStreams {
public static void main(String[] args) {
Arrays.stream(new int[] {2, 4, 6, 8, 10})


.map(x -> x * x)


.average()


.ifPresent(System.out::println);
} }

Framleiðsla:

44.0

Athugið að það prentar út tvöfalt í stað heiltölu.

Streymdu frá lista, síaðu og prentaðu

Í þessu dæmi ætlum við að streyma af lista, sía þá hluti og prenta síðan.

Athugaðu að innan map() virka, við ætlum að breyta öllum nöfnum í lágstafi.

import java.util.Arrays; import java.util.List; public class JavaStreams {
public static void main(String[] args) {
List people = Arrays.asList('Al', 'Ankit', 'Brent', 'Sarika', 'amanda', 'Hans', 'Shivika', 'Sarah');
people


.stream()


.map(String::toLowerCase)


.filter(x -> x.startsWith('a'))


.forEach(System.out::println);
} }

Framleiðsla:

al ankit amanda

Við sjáum að við höfum þrjú nöfn sem byrja á a og þeir eru allir í lágstöfum.

Streymdu línum úr textaskrá, raðaðu, síaðu og prentaðu

Í næsta dæmi okkar ætlum við að streyma línum úr textaskrá. Við ætlum að flokka, sía og prenta.

Við skulum gera ráð fyrir að við höfum skrá sem heitir bands.txt með innihaldinu sýnt hér að neðan:

Rolling Stones Lady Gaga Jackson Browne Maroon 5 Arijit Singh Elton John John Mayer CCR Eagles Pink Aerosmith Adele Taylor Swift

Við ætlum að nota Files.lines() til að búa til strauminn okkar sem ætlar að gefa okkur straum af streng fyrir hverja skráarlínu.

Þegar við höfum fengið strauminn okkar ætlum við að raða þeim og við ætlum að sía hluti sem eru stærri en 13 stafir og prenta síðan hlutina sem eftir eru.

Loks verðum við að loka skránni svo við gerum bands.close.

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream; public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream bands = Files.lines(Paths.get('bands.txt'));
bands


.sorted()


.filter(x -> x.length() > 13)


.forEach(System.out::println);
bands.close();
} }

Framleiðsla:

Jackson Browne Rolling Stones

Við fáum tvær hljómsveitir sem eru með meira en 13 stafi.

Streymdu línum úr textaskrá og vistaðu á Lista

Fyrir þetta dæmi munum við nota sömu textaskrá og að ofan.

Við viljum sía hluti sem innihalda stafina jit, með x.contains() sem er bara strengjaaðgerð.

Notkun .collect() við bætum við öllum þeim með bókstöfum jit á lista.

Þegar við erum komnir með lista, getum við notað forEach rekstraraðila til að prenta hlutina.

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; public class JavaStreams {
public static void main(String[] args) throws IOException {
List bands2 = Files.lines(Paths.get('bands.txt'))


.filter(x -> x.contains('jit'))


.collect(Collectors.toList());
bands2.forEach(x -> System.out.println(x));
} }

Framleiðsla:

Arijit Singh

Streymdu línum úr CSV skrá og telja

Í þessu dæmi streymum við línum úr CSV-skrá og ætlum að telja góðu línurnar.

Segjum að við séum með skrá sem heitir data.txt með eftirfarandi innihaldi:

A,12,3.7 B,17,2.8 C,14,1.9 D,23,2.7 E F,18,3.4

Hér hefur röð E engin gögn, svo við viljum útiloka þann frá straumnum okkar.

Í eftirfarandi kóða ætlum við að lesa í hverri röð og þá verðum við að skipta í kommunum í fylki svo hver röð verði að fylkingu atriða.

Síðan notum við síu til að sía línur sem eru ekki með þrjá hluti.

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream; public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream rows1 = Files.lines(Paths.get('data.txt'));
int rowCount = (int)rows1


.map(x -> x.split(','))


.filter(x -> x.length == 3)


.count();
System.out.println(rowCount + ' rows.');
rows1.close();
} }

Framleiðsla:

5 rows

Lækkun - summan

Þetta dæmi sýnir þér hvernig á að nota lækkun. Við ætlum að lækka niður í upphæð. Hér höfum við tvöfaldan straum með því að nota Stream.of() virka. Við höfum skilgreint þrjá tvímenninga í þremur mismunandi rökum og ætlum að nota draga úr aðgerðinni.

import java.util.stream.Stream; public class JavaStreams {
public static void main(String[] args) {
double total = Stream.of(7.3, 1.5, 4.8)


.reduce(0.0, (Double a, Double b) -> a + b);
System.out.println('Total = ' + total);
} }

Framleiðsla:

13.600000000000001