prominent java 8 features with code examples
En omfattende liste og forklaring på alle de fremtredende funksjonene introdusert i Java 8-utgivelse med eksempler:
Java 8-utgivelse fra Oracle var en revolusjonerende utgivelse av verdens # 1 utviklingsplattform. Den inkluderte en stor oppgradering av Java-programmeringsmodellen som helhet sammen med utviklingen av JVM, Java-språk og biblioteker på en koordinert måte.
Denne utgaven inkluderte flere funksjoner for brukervennlighet, produktivitet, forbedret polyglot-programmering, sikkerhet og forbedret ytelse generelt.
Hva du vil lære:
- Funksjoner lagt til Java 8 Release
- Funksjonelle grensesnitt og Lambda-uttrykk
- forEach () Metode i Iterabelt grensesnitt
- Valgfri klasse
- Standard og statiske metoder i grensesnitt
- Metode Referanser
- Java Stream API for massedataoperasjoner på samlinger
- Java Date Time API
- Rhinoceros JavaScript-motor
- Base64 Kode dekode
- Samling API Forbedringer
- Samtidige endringer / forbedringer av API
- Java IO-forbedringer
- Diverse Core API-forbedringer
- Konklusjon
Funksjoner lagt til Java 8 Release
Blant de store endringene er følgende de bemerkelsesverdige funksjonene som ble lagt til denne utgivelsen.
- Funksjonelle grensesnitt og Lambda Expressions
- forEach () -metoden i Iterabelt grensesnitt
- Valgfri klasse,
- standard- og statiske metoder i grensesnitt
- Metodehenvisninger
- Java Stream API for massedataoperasjoner på samlinger
- Java Date Time API
- Samling API forbedringer
- Samtidige API-forbedringer
- Java IO forbedringer
- Rhinoceros JavaScript-motor
- Base64 Kode dekode
- Diverse Core API-forbedringer
I denne opplæringen vil vi diskutere hver av disse funksjonene kort og prøve å forklare hver av dem ved hjelp av enkle og enkle eksempler.
Funksjonelle grensesnitt og Lambda-uttrykk
Java 8 introduserer en kommentar kjent som @FunctionalInterface som vanligvis er for feil på kompilatornivå. Det brukes vanligvis når grensesnittet du bruker bryter kontraktene for funksjonelt grensesnitt.
Alternativt kan du kalle et funksjonelt grensesnitt som SAM-grensesnitt eller Single Abstract Method-grensesnitt. Et funksjonelt grensesnitt tillater nøyaktig en “abstrakt metode” som medlem.
Nedenfor er gitt et eksempel på funksjonelt grensesnitt:
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); }
Du kan utelate kommentaren, @FunctionalInterface og ditt funksjonelle grensesnitt vil fortsatt være gyldig. Vi bruker denne merknaden bare for å informere kompilatoren om at grensesnittet vil ha en enkelt abstrakt metode.
Merk: Per definisjon er standardmetoder ikke-abstrakte, og du kan legge til så mange standardmetoder i det funksjonelle grensesnittet du vil.
For det andre, hvis et grensesnitt har en abstrakt metode som overstyrer en av de offentlige metodene til 'java.lang.object', blir det ikke ansett som grensesnittets abstrakte metode.
Nedenfor er et gyldig eksempel på funksjonelt grensesnitt.
@FunctionalInterface public interface FunctionalInterface_one { public void firstInt_method(); @Override public String toString(); //Overridden from Object class @Override public boolean equals(Object obj); //Overridden from Object class }
Et Lambda-uttrykk (eller funksjon) kan defineres som en anonym funksjon, (en funksjon uten navn og identifikator). Lambda-uttrykk er definert nøyaktig på stedet der det er behov for dem, vanligvis som en parameter til en annen funksjon.
Fra et annet perspektiv uttrykker Lambda Expressions forekomster av Funksjonelle grensesnitt (beskrevet ovenfor). Lambda Expressions implementerer den eneste abstrakte funksjonen som er tilstede i det funksjonelle grensesnittet og implementerer dermed funksjonelle grensesnitt.
Den grunnleggende syntaksen til et Lambda-uttrykk er:
Et grunnleggende eksempel på Lambda-uttrykket er:
Ovennevnte uttrykk tar to parametere x og y og returnerer summen x + y. Basert på datatypen x og y, kan metoden brukes flere ganger på forskjellige steder. Dermed vil parameterne x og y matche int eller Heltall og streng, og basert på kontekst vil det legge til to heltall (når parametrene er int) eller konkatisere de to strengene (når parametrene er en streng).
La oss implementere et program som demonstrerer Lambda Expressions.
interface MyInterface { void abstract_func(int x,int y); default void default_Fun() { System.out.println('This is default method'); } } class Main { public static void main(String args()) { //lambda expression MyInterface fobj = (int x, int y)->System.out.println(x+y); System.out.print('The result = '); fobj.abstract_func(5,5); fobj.default_Fun(); } }
Produksjon:
Ovennevnte program viser bruken av Lambda Expression for å legge til parametere og viser summen. Deretter bruker vi dette til å implementere den abstrakte metoden “abstract_fun” som vi erklærte i grensesnittdefinisjonen. Resultatet av å kalle funksjonen “abstrakt_fun” er summen av de to heltallene som sendes som parametere mens du kaller funksjonen.
sql server intervju spørsmål og svar for erfarne med eksempler
Vi vil lære mer om Lambda Expressions senere i opplæringen.
forEach () Metode i Iterabelt grensesnitt
Java 8 har introdusert en 'forEach' -metode i grensesnittet java.lang.Iterable som kan gjentas over elementene i samlingen. 'ForEach' er en standardmetode definert i Iterable-grensesnittet. Den brukes av Collection-klassene som utvider det Iterable grensesnittet til iterere elementer.
“ForEach” -metoden tar funksjonsgrensesnittet som en enkelt parameter, dvs. du kan sende Lambda-uttrykk som et argument.
Eksempel på metoden forEach ().
importjava.util.ArrayList; importjava.util.List; public class Main { public static void main(String() args) { List subList = new ArrayList(); subList.add('Maths'); subList.add('English'); subList.add('French'); subList.add('Sanskrit'); subList.add('Abacus'); System.out.println('------------Subject List--------------'); subList.forEach(sub -> System.out.println(sub)); } }
Produksjon:
Så vi har en samling emner, dvs. subliste. Vi viser innholdet i underlisten ved hjelp av forEach-metoden som tar Lambda Expression for å skrive ut hvert element.
Valgfri klasse
Java 8 introduserte en valgfri klasse i 'java.util' -pakken. “Valgfritt” er en offentlig sluttklasse og brukes til å håndtere NullPointerException i Java-applikasjonen. Ved å bruke Valgfritt kan du spesifisere alternativ kode eller verdier som skal kjøres. Ved å bruke Valgfritt trenger du ikke bruke for mange nullkontroller for å unngå nullPointerException.
Du kan bruke klassen Valgfritt for å unngå unormal avslutning av programmet og forhindre at programmet krasjer. Valgfri klasse gir metoder som brukes til å kontrollere tilstedeværelsen av verdi for en bestemt variabel.
Følgende program viser bruken av den valgfrie klassen.
import java.util.Optional; public class Main{ public static void main(String() args) { String() str = new String(10); OptionalcheckNull = Optional.ofNullable(str(5)); if (checkNull.isPresent()) { String word = str(5).toLowerCase(); System.out.print(str); } else System.out.println('string is null'); } }
Produksjon:
I dette programmet bruker vi egenskapen “ofNullable” til klassen Valgfri for å sjekke om strengen er null. Hvis det er tilfelle, skrives den riktige meldingen ut til brukeren.
Standard og statiske metoder i grensesnitt
I Java 8 kan du legge til metoder i grensesnittet som ikke er abstrakte, dvs. du kan ha grensesnitt med metodeimplementering. Du kan bruke søkeordet Standard og Statisk for å lage grensesnitt med metodeimplementering. Standardmetoder aktiverer hovedsakelig Lambda Expression-funksjonalitet.
Ved å bruke standardmetoder kan du legge til ny funksjonalitet i grensesnittene dine i bibliotekene dine. Dette vil sikre at koden skrevet for de eldre versjonene er kompatibel med disse grensesnittene (binær kompatibilitet).
La oss forstå standardmetoden med et eksempel:
import java.util.Optional; interface interface_default { default void default_method(){ System.out.println('I am default method of interface'); } } class derived_class implements interface_default{ } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); obj1.default_method(); } }
Produksjon:
Vi har et grensesnitt kalt “interface_default” med metoden default_method () med standardimplementering. Deretter definerer vi en klasse 'derivated_class' som implementerer grensesnittet 'interface_default'.
Merk at vi ikke har implementert noen grensesnittmetoder i denne klassen. Så i hovedfunksjonen lager vi et objekt av klassen “derivated_class” og kaller direkte “default_method” for grensesnittet uten å måtte definere det i klassen.
Dette er bruken av standard og statiske metoder i grensesnittet. Imidlertid, hvis en klasse ønsker å tilpasse standardmetoden, kan du gi sin egen implementering ved å overstyre metoden.
Metode Referanser
Metodereferansefunksjonen introdusert i Java 8 er en forkortelse for Lambda Expressions for å kalle en metode for funksjonelt grensesnitt. Så hver gang du bruker et Lambda-uttrykk for å henvise til en metode, kan du erstatte Lambda-uttrykket med metodereferanse.
Eksempel på metodehenvisning.
import java.util.Optional; interface interface_default { void display(); } class derived_class{ public void classMethod(){ System.out.println('Derived class Method'); } } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); interface_default ref = obj1::classMethod; ref.display(); } }
Produksjon:
I dette programmet har vi et grensesnitt 'interface_default' med en abstrakt metode 'display ()'. Deretter er det en klasse 'derivated_class' som har en offentlig metode 'classMethod' som skriver ut en melding.
I hovedfunksjonen har vi et objekt for klassen, og så har vi en referanse til grensesnittet som refererer til en klassemetode “classMethod” gjennom obj1 (class object). Nå når den abstrakte metoden vises etter grensesnittreferanse, vises innholdet i classMethod.
Java Stream API for massedataoperasjoner på samlinger
Stream API er enda en stor endring introdusert i Java 8. Stream API brukes til å behandle samlingen av objekter, og den støtter en annen type iterasjon. En strøm er en sekvens av objekter (elementer) som lar deg pipeline forskjellige metoder for å gi de ønskede resultatene.
En strøm er ikke en datastruktur, og den mottar innspill fra samlinger, matriser eller andre kanaler. Vi kan pipeline forskjellige mellomliggende operasjoner ved hjelp av Streams, og terminaloperasjonene returnerer resultatet. Vi vil diskutere stream API mer detaljert i en egen Java-veiledning.
Java Date Time API
Java 8 introduserer en ny API for dato-tid under pakken java.time.
De viktigste klassene blant dem er:
- Lokalt: Forenklet API for dato og tid uten kompleksitet i håndtering av tidssone.
- Sone: Spesialisert API for dato og tid for å håndtere forskjellige tidssoner.
Datoer
Datoklasse er blitt foreldet i Java 8.
Følgende er de nye klassene introdusert:
- LocalDate-klassen definerer en dato. Den har ingen representasjon for tid eller tidssone.
- LocalTime klasse definerer en tid. Den har ingen representasjon for dato eller tidssone.
- LocalDateTime-klassen definerer en dato-tid. Den har ingen representasjon av en tidssone.
For å inkludere tidssoneinformasjon med datofunksjonalitet, kan du bruke Lambda som gir 3 klasser, dvs. OffsetDate, OffsetTime og OffsetDateTime. Her er tidssoneforskyvning representert ved hjelp av en annen klasse - “ZoneId”. Vi vil dekke dette emnet i detalj i de senere delene av denne Java-serien.
Rhinoceros JavaScript-motor
Java 8 introduserte en mye forbedret motor for JavaScript, dvs. Nashorn som erstatter den eksisterende Rhino. Nashorn kompilerer koden direkte i minnet og sender deretter bytekoden til JVM og forbedrer ytelsen med 10 ganger.
Nashorn introduserer et nytt kommandolinjeverktøy - jjs som utfører JavaScript-kode på konsollen.
La oss lage en JavaScript-fil ‘sample.js’ som inneholder følgende kode.
print (‘Hello, World!!’);
Gi følgende kommando i konsollen:
C: Java jjs sample.js
Produksjon: Hei Verden!!
Vi kan også kjøre JavaScript-programmer i interaktiv modus og også gi argumenter til programmene.
Base64 Kode dekode
I Java 8 er det innebygd koding og dekoding for Base64-koding. Klassen for Base64-koding er java.util.Base64.
Denne klassen inneholder tre Base64-koder og dekodere:
- Grunnleggende: I dette blir utdataene tilordnet et sett med tegn mellom A-Za-z0-9 + /. Ingen linjefôr legges til utgangen av koderen, og dekoderen avviser noe annet tegn enn det ovennevnte.
- URL: Her er utgangen URL og filnavnet tilordnes til settet med tegn mellom A-Za-z0-9 + /.
- MIME: I denne typen kodere blir utdataene tilordnet et MIME-vennlig format.
Samling API Forbedringer
Java 8 har lagt til følgende nye metoder i Collection API:
- forEachRemaining (forbrukerhandling): Dette er en standardmetode og er for Iterator. Den utfører 'handlingen' for hvert av de gjenværende elementene til alle elementene er behandlet eller 'handling' gir et unntak.
- Standardmetoden for samling removeIf (Predicate filter): Dette fjerner alle elementene i samlingen som tilfredsstiller det gitte 'filteret'.
- Spliterator (): Dette er en samlingsmetode og returnerer spliterator-forekomst som du kan bruke til å krysse elementene på en sekvensiell eller parallell måte.
- Kartinnsamling har substitutterAll (), beregne () og flette () metoder.
- HashMap-klassen med nøkkelkollisjoner er forbedret for å forbedre ytelsen.
Samtidige endringer / forbedringer av API
Følgende er de viktige forbedringene i Concurrent API:
- ConcurrentHashMap er forbedret med følgende metoder:
- beregne (),
- for hver (),
- forEachEntry (),
- forEachKey (),
- forEachValue (),
- gå (),
- redusere () og
- Søk ()
- Metoden “newWorkStealingPool ()” for eksekutører skaper en arbeidsstele trådgruppe. Den bruker tilgjengelige prosessorer som målparallellismenivå.
- Metoden “completeableFuture” er den vi kan fullføre eksplisitt (ved å sette dens verdi og status).
Java IO-forbedringer
IO-forbedringer gjort i Java 8 inkluderer:
- Files.list (bane dir): Dette returnerer en jazilyfylt strøm, der hvert element er oppføringen i katalogen.
- Files.lines (sti): Les alle linjene fra en strøm.
- Files.find (): Søk etter filer i filtreet som er forankret i en gitt startfil og returnerer en strøm fylt av en bane.
- BufferedReader.lines (): Returnerer en strøm med hvert element når linjene leses fra BufferedReader.
Diverse Core API-forbedringer
Vi har følgende diverse API-forbedringer:
- Statisk metode medInitial (leverandørleverandør) av ThreadLocal for å lage forekomst enkelt.
- Grensesnittet 'Comparator' utvides med standard og statiske metoder for naturlig bestilling av omvendt rekkefølge etc.
- Integer, Long og Double wrapper klasser har min (), max () og sum () metoder.
- Boolsk klasse forbedres med logicalAnd (), logicalOr () og logicalXor () -metoder.
- Flere verktøy metoder er introdusert i matematikk klassen.
- JDBC-ODBC Bridge er fjernet.
- PermGen-minne er fjernet.
Konklusjon
I denne veiledningen har vi diskutert de viktigste funksjonene som ble lagt til Java 8-utgivelsen. Siden Java 8 er en stor utgivelse fra Java, er det viktig at du kjenner til alle funksjonene og forbedringene som ble gjort som en del av denne utgivelsen.
Selv om den nyeste Java-versjonen er 13, er det fortsatt en god ide å bli kjent med Java 8-funksjonene. Alle funksjonene som er diskutert i denne opplæringen, er fremdeles til stede i den nyeste versjonen av Java, og vi vil diskutere dem som individuelle emner senere i denne serien.
Vi håper denne opplæringen hjalp deg med å lære om forskjellige Java 8-funksjoner!
Anbefalt lesing
- Java Array Length Tutorial med kodeeksempler
- Java 'dette' nøkkelord: Opplæring med kodeeksempler
- Java-grensesnitt og abstrakt klasseopplæring med eksempler
- JAVA-opplæring for nybegynnere: 100+ praktiske Java-videoveiledninger
- Java-distribusjon: Opprettelse og utføring av Java JAR-fil
- C ++ Vs Java: Topp 30 forskjeller mellom C ++ og Java med eksempler
- MongoDB Sort () Metode med eksempler
- Utforsk det essensielle av Java i selen med eksempler