1. Innovasjoner i Java 8: Funksjonell programmering

Med utgivelsen av Java 8 fikk språket kraftig støtte for funksjonell programmering . Du kan til og med si at den fikk etterlengtet støtte for funksjonell programmering. Koding ble raskere, selv om koden var vanskeligere å lese 🙂

Før du lærer funksjonell programmering i Java, anbefaler vi at du forstår tre ting godt:

  1. OOP, arv og grensesnitt ( nivå 1-2 i Java Core-oppdraget ).
  2. Standard metodeimplementeringer i et grensesnitt .
  3. Indre og anonyme klasser .

Den gode nyheten er at du ikke trenger å kunne alt dette for å bruke mange av funksjonene til funksjonell programmering i Java. Den dårlige nyheten er at det vil være vanskelig å forstå nøyaktig hvordan alt er ordnet og hvordan alt fungerer uten å vite om anonyme indre klasser.

I de kommende leksjonene vil vi fokusere på hvor enkelt og enkelt det er å bruke Javas funksjonelle programmeringsfunksjoner, uten en dyp forståelse av hvordan det fungerer.

Det tar måneder å forstå alle nyansene ved funksjonell programmering i Java. Du kan lære å lese slik kode i løpet av noen timer. Så vi foreslår å starte i det små. Selv om det er med I/O-strømmer.


2. I/O-strømmer: strømrørledninger

Husker du at du en gang i tiden lærte om I/O-strømmer: InputStream, OutputStream, Reader, Writerosv.?

Det var strømklasser som leste data fra datakilder , for eksempel FileInputSteam, og det var mellomliggende datastrømmer som leste data fra andre strømmer, for eksempel InputStreamReaderog BufferedReader.

Disse strømmene kan organiseres i databehandlingsrørledninger. For eksempel slik:

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

Det er viktig å merke seg at i de første kodelinjene konstruerer vi bare en kjede av Streamobjekter. Dataene har ikke gått gjennom rørledningen ennå.

Men så snart vi kaller buff.readLine()metoden, vil følgende skje:

  1. Objektet BufferedReaderkaller read()metoden på InputStreamReaderobjektet
  2. Objektet InputStreamReaderkaller read()metoden på FileInputStreamobjektet
  3. Objektet FileInputStreambegynner å lese data fra filen

Med andre ord er det ingen bevegelse av data langs strømledningen før vi begynner å kalle metoder som read()eller readLine(). Bare konstruksjonen av strømrørledningen driver ikke data gjennom den. Strømmene i seg selv lagrer ikke data. De leser bare fra andre.

Samlinger og strømmer

Fra og med Java 8 ble det mulig å få en strøm til å lese data fra samlinger (og ikke bare fra dem). Men dette er ikke det mest interessante. Det ble faktisk mulig å enkelt og enkelt konstruere komplekse kjeder av datastrømmer. Og ved å gjøre det kunne koden som tidligere tok 5-10 linjer nå skrives i 1-2 linjer.

Eksempel på å finne den lengste strengen i en liste over strenger:

Finne den lengste strengen
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3. Streamgrensesnitt

Java 8s utvidede støtte for strømmer er implementert ved hjelp av Stream<T>grensesnittet, der Ter en typeparameter som indikerer typen data som sendes i strømmen. En strøm er med andre ord helt uavhengig av hvilken type data den sender.

For å hente et strømobjekt fra en samling , ring bare stream()metoden. Koden ser omtrent slik ut:

Stream<Type> name = collection.stream();
Få en strøm fra en samling

I dette tilfellet vil samlingen betraktes som strømmens datakilde, og objektet Stream<Type>vil være et verktøy for å hente data fra samlingen i form av en datastrøm.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();

Forresten, du kan få en strøm ikke bare fra samlinger, men også fra matriser . For å gjøre dette, må du bruke metoden. For eksempel:Arrays.stream()

Stream<Type> name = Arrays.stream(array);
Få en strøm fra en array

I dette tilfellet vil arrayet bli betraktet som datakilden for strømmen kalt name.

Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);

Ingen data flyttes når Stream<Type>objektet opprettes. Vi fikk rett og slett et bekkeobjekt for å begynne å bygge en bekkeledning.