prominent java 8 features with code examples
Una llista completa i una explicació de totes les funcions destacades introduïdes a la versió 8 de Java amb exemples:
La versió de Java 8 d’Oracle va ser una versió revolucionària de la plataforma de desenvolupament número 1 del món. Incloïa una enorme actualització del model de programació Java en conjunt juntament amb l'evolució de la JVM, el llenguatge Java i les biblioteques d'una manera coordinada.
Aquesta versió inclou diverses funcions per a la facilitat d'ús, la productivitat, la programació poliglota millorada, la seguretat i el rendiment global millorat.
Què aprendreu:
- Funcions afegides a la versió de Java 8
- Interfícies funcionals i expressions Lambda
- forEach () Mètode en interfície iterable
- Classe opcional
- Mètodes predeterminats i estàtics a les interfícies
- Referències del mètode
- API Java Stream per a operacions de dades massives en col·leccions
- API Data i hora de Java
- Motor JavaScript rinoceront
- Decodificar Codificar Base64
- Millores de l'API de col·lecció
- Canvis / Millores de l'API de simultaneïtat
- Millores de Java IO
- Millores de diverses API bàsiques
- Conclusió
Funcions afegides a la versió de Java 8
Entre els principals canvis, es detallen a continuació les característiques destacables que es van afegir a aquesta versió.
- Interfícies funcionals i Lambda Expressions
- mètode forEach () a la interfície Iterable
- Classe opcional,
- mètodes estàtics i predeterminats a Interfaces
- Referències de mètodes
- API Java Stream per a operacions de dades massives en col·leccions
- API Data i hora de Java
- Millores de l'API de col·lecció
- Millores de l'API de simultaneïtat
- Millores de Java IO
- Motor JavaScript rinoceront
- Decodificar Codificar Base64
- Millores diverses de l'API bàsica
En aquest tutorial, analitzarem breument cadascuna d’aquestes funcions i intentarem explicar-les cadascuna amb l’ajut d’exemples senzills i senzills.
Interfícies funcionals i expressions Lambda
Java 8 introdueix una anotació coneguda com a @FunctionalInterface que sol ser per a errors de nivell del compilador. Normalment s’utilitza quan la interfície que utilitzeu infringeix els contractes de la interfície funcional.
avantatges de Linux sobre Windows 10
Com a alternativa, podeu trucar a una interfície funcional com a interfície SAM o interfície de mètode abstracte únic. Una interfície funcional permet exactament un 'mètode abstracte' com a membre.
A continuació es mostra un exemple d’interfície funcional:
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); }
Podeu ometre l’anotació, @FunctionalInterface i la vostra interfície funcional continuarà sent vàlida. Utilitzem aquesta anotació només per informar al compilador que la interfície tindrà un únic mètode abstracte.
Nota: Per definició, els mètodes predeterminats no són abstractes i podeu afegir tants mètodes predeterminats a la interfície funcional com vulgueu.
En segon lloc, si una interfície té un mètode abstracte que anul·la un dels mètodes públics de 'java.lang.object', no es considera el mètode abstracte de la interfície.
A continuació es mostra un exemple d’interfície funcional vàlida.
@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 }
Una expressió (o funció) Lambda es pot definir com una funció anònima (una funció sense nom i identificador). Les expressions Lambda es defineixen exactament al lloc on es necessiten, normalment com a paràmetre d’alguna altra funció.
Des d’una perspectiva diferent, les expressions de Lambda expressen casos de Interfícies funcionals (descrit anteriorment). Les expressions Lambda implementen l'única funció abstracta present a la interfície funcional i, per tant, implementen interfícies funcionals.
La sintaxi bàsica d'una expressió Lambda és:
Un exemple bàsic de l’expressió Lambda és:
L’expressió anterior pren dos paràmetres x i y retorna la seva suma x + y. Basat en el tipus de dades de xey, el mètode es pot utilitzar diverses vegades en diversos llocs. Així, els paràmetres x i y coincidiran amb int o Enter i string, i en funció del context, afegirà dos enters (quan els paràmetres són int) o concatenaran les dues cadenes (quan els paràmetres són una cadena).
Implantem un programa que demostri les expressions de Lambda.
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(); } }
Sortida:
El programa anterior mostra l’ús de Lambda Expression per afegir-los a paràmetres i mostra la seva suma. A continuació, ho fem servir per implementar el mètode abstracte 'abstract_fun' que vam declarar a la definició de la interfície. El resultat de cridar la funció 'abstract_fun' és la suma dels dos enters passats com a paràmetres mentre es crida la funció.
Més endavant aprendrem més sobre Lambda Expressions al tutorial.
forEach () Mètode en interfície iterable
Java 8 ha introduït un mètode 'forEach' a la interfície java.lang.Iterable que pot recórrer els elements de la col·lecció. 'ForEach' és un mètode predeterminat definit a la interfície Iterable. És utilitzat per les classes Collection que amplien la interfície Iterable per iterar elements.
El mètode 'forEach' pren la interfície funcional com a paràmetre únic, és a dir, podeu passar l'expressió Lambda com a argument.
Exemple del mètode 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)); } }
Sortida:
Per tant, tenim una col·lecció de temes, és a dir, subLista. Visualitzem el contingut de la subLista mitjançant el mètode forEach que necessita Lambda Expression per imprimir cada element.
Classe opcional
Java 8 va introduir una classe opcional al paquet 'java.util'. 'Opcional' és una classe final pública i s'utilitza per tractar NullPointerException a l'aplicació Java. Amb Opcional, podeu especificar codis o valors alternatius per executar. Si utilitzeu l'opcional, no cal que feu servir massa controls de nul per evitar l'excepció nullPointerException.
Podeu utilitzar la classe Opcional per evitar la finalització anormal del programa i evitar que el programa es bloquegi. La classe Opcional proporciona mètodes que s’utilitzen per comprovar la presència de valor d’una variable concreta.
El programa següent mostra l’ús de la classe Opcional.
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'); } }
Sortida:
En aquest programa, fem servir la propietat 'ofNullable' de la classe Optional per comprovar si la cadena és nul·la. Si és així, s'imprimeix el missatge adequat a l'usuari.
preguntes i respostes d’entrevistes de suport tècnic per a estudiants de primer any
Mètodes predeterminats i estàtics a les interfícies
A Java 8, podeu afegir mètodes a la interfície que no siguin abstractes, és a dir, podeu tenir interfícies amb la implementació de mètodes. Podeu utilitzar la paraula clau estàtica i predeterminada per crear interfícies amb la implementació del mètode. Els mètodes predeterminats permeten principalment la funcionalitat Expressió Lambda.
Mitjançant mètodes predeterminats podeu afegir noves funcionalitats a les vostres interfícies a les biblioteques. Això garantirà que el codi escrit per a les versions anteriors sigui compatible amb aquestes interfícies (compatibilitat binària).
Vegem el mètode predeterminat amb un exemple:
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(); } }
Sortida:
Tenim una interfície anomenada 'interface_default' amb el mètode default_method () amb una implementació predeterminada. A continuació, definim una classe 'classe_derivada' que implementa la interfície 'interface_default'.
Tingueu en compte que no hem implementat cap mètode d'interfície en aquesta classe. A continuació, a la funció principal, creem un objecte de la classe 'classe_derivada' i anomenem directament el mètode per defecte de la interfície sense haver de definir-lo a la classe.
Aquest és l’ús de mètodes estàtics i predeterminats a la interfície. Tanmateix, si una classe vol personalitzar el mètode per defecte, podeu proporcionar la seva pròpia implementació anul·lant el mètode.
Referències del mètode
La característica de referència de mètode introduïda a Java 8 és una notació abreujada perquè Lambda Expressions anomeni un mètode d’interfície funcional. Per tant, cada vegada que utilitzeu una expressió Lambda per referir un mètode, podeu substituir la vostra expressió Lambda per referència de mètode.
Exemple de referència de mètode.
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(); } }
Sortida:
En aquest programa, tenim una interfície “interface_default” amb un mètode abstracte “display ()”. A continuació, hi ha una classe 'classe_derivada' que té un mètode públic 'classMethod' que imprimeix un missatge.
A la funció principal, tenim un objecte per a la classe i, a continuació, tenim una referència a la interfície que fa referència a un mètode de classe “classMethod” mitjançant obj1 (objecte de classe). Ara, quan es mostra la visualització del mètode abstracte per referència a la interfície, es mostren els continguts de classMethod.
API Java Stream per a operacions de dades massives en col·leccions
L'API Stream és un altre canvi important introduït a Java 8. L'API Stream s'utilitza per processar la col·lecció d'objectes i admet un tipus diferent d'iteració. Un flux és una seqüència d'objectes (elements) que us permet canviar diferents mètodes per produir els resultats desitjats.
Un flux no és una estructura de dades i rep les seves aportacions de col·leccions, matrius o altres canals. Podem canalitzar diverses operacions intermèdies mitjançant Streams i les operacions del terminal retornen el resultat. Discutirem l'API de flux amb més detall en un tutorial Java diferent.
API Data i hora de Java
Java 8 introdueix una nova API de data i hora al paquet java.time.
Les classes més importants entre elles són:
- local: API simplificada de data i hora sense complexitat en la gestió de la zona horària.
- Zonificat: API de data i hora especialitzada per tractar diverses zones horàries.
Dates
La data class ha quedat obsoleta a Java 8.
A continuació es presenten les noves classes:
- La classe LocalDate defineix una data. No té representació horària ni de zona horària.
- L'hora local classe defineix un temps. No té representació ni de data ni de zona horària.
- La classe LocalDateTime defineix una data-hora. No té representació d'una zona horària.
Per incloure informació de zona horària amb funcionalitat de data, podeu utilitzar Lambda que proporciona 3 classes, és a dir, OffsetDate, OffsetTime i OffsetDateTime. Aquí el desplaçament de la zona horària es representa mitjançant una altra classe: 'ZoneId'. Tractarem aquest tema en detall a les parts posteriors d'aquesta sèrie Java.
Motor JavaScript rinoceront
Java 8 va introduir un motor molt millorat per JavaScript, és a dir, Nashorn que substitueix el Rhino existent. Nashorn compila directament el codi a la memòria i passa el bytecode a JVM, millorant així el rendiment en 10 vegades.
Nashorn introdueix una nova eina de línia d'ordres: jjs que executa codi JavaScript a la consola.
Creeu-nos un fitxer JavaScript 'sample.js' que contingui el codi següent.
print (‘Hello, World!!’);
Doneu l'ordre següent a la consola:
C: Java jjs sample.js
Sortida: Hola món!!
També podem executar programes JavaScript en mode interactiu i també proporcionar arguments als programes.
Decodificar Codificar Base64
A Java 8 hi ha codificació i descodificació incorporades per a la codificació Base64. La classe per a la codificació Base64 és java.util.Base64.
Aquesta classe proporciona tres codificadors i descodificadors Base64:
- Bàsic: En això, la sortida s’assigna a un conjunt de caràcters entre A-Za-z0-9 + /. El codificador no afegeix cap aliment de línia a la sortida i el descodificador rebutja qualsevol caràcter que no sigui l'anterior.
- URL: Aquí la sortida és l'URL i el nom de fitxer segur està assignat al conjunt de caràcters entre A-Za-z0-9 + /.
- MIME: En aquest tipus de codificador, la sortida s’assigna a un format MIME friendly.
Millores de l'API de col·lecció
Java 8 ha afegit els mètodes nous següents a l'API de col·lecció:
- forEachRemaining (acció del consumidor): es tracta d'un mètode predeterminat i és per a l'iterador. Realitza l ''acció' per a cadascun dels elements restants fins que es processen tots els elements o 'l'acció' produeix una excepció.
- El mètode per defecte per a la col·lecció removeIf (filtre predicat): elimina tots els elements de la col·lecció que compleixen el 'filtre' donat.
- Spliterator (): es tracta d'un mètode de recopilació i retorna la instància de spliterator que podeu utilitzar per recórrer els elements de manera seqüencial o paral·lela.
- La col·lecció de mapes té mètodes replaceAll (), compute () i merge ().
- La classe HashMap amb col·lisions de claus s'ha millorat per millorar el rendiment.
Canvis / Millores de l'API de simultaneïtat
A continuació es mostren les millores importants de l'API simultània:
- ConcurrentHashMap es millora amb els mètodes següents:
- compute (),
- per cadascú (),
- forEachEntry (),
- forEachKey (),
- forEachValue (),
- go (),
- reduce () i
- cerca ()
- El mètode 'newWorkStealingPool ()' per als executors crea un grup de fils de robatori de treball. Utilitza els processadors disponibles com a nivell de paral·lelisme objectiu.
- El mètode 'completableFuture' és el que podem completar explícitament (establint el seu valor i estat).
Millores de Java IO
Les millores d’IO realitzades a Java 8 inclouen:
- Files.list (direcció del camí): Això retorna un flux de població molt jove, cada element del qual és l'entrada del directori.
- Files.lines (camí d'accés): Llegeix totes les línies d'un flux.
- Files.find (): Cerqueu fitxers a l’arbre de fitxers arrelat a un fitxer d’inici determinat i retorna una transmissió poblada per un camí d'accés.
- BufferedReader.lines (): Retorna un flux amb tots els seus elements a mesura que les línies es llegeixen des de BufferedReader.
Millores de diverses API bàsiques
Tenim les següents millores d'API diverses:
- Mètode estàtic ambInicial (proveïdor del proveïdor) de ThreadLocal per crear instàncies fàcilment.
- La interfície “Comparador” s’amplia amb els mètodes estàtics i predeterminats per a l’ordre invers d’ordres naturals, etc.
- Les classes enter, long i double wrapper tenen mètodes min (), max () i sum ().
- La classe booleana es millora amb els mètodes logicAnd (), logicOr () i logicXor ().
- A la classe de matemàtiques s’introdueixen diversos mètodes d’utilitat.
- El pont JDBC-ODBC s’elimina.
- S'elimina l'espai de memòria PermGen.
Conclusió
En aquest tutorial, hem comentat les principals funcions que es van afegir a la versió de Java 8. Com que Java 8 és una versió important de Java, és important que conegueu totes les funcions i millores que es van fer com a part d'aquesta versió.
Tot i que l’última versió de Java és 13, no deixa de ser una bona idea familiaritzar-se amb les funcions de Java 8. Totes les funcions comentades en aquest tutorial continuen presents a la versió més recent de Java i les tractarem com a temes individuals més endavant en aquesta sèrie.
Esperem que aquest tutorial us ajudi a conèixer diverses funcions de Java 8.
Lectura recomanada
- Tutorial de longitud de matriu de Java amb exemples de codi
- Paraula clau 'aquesta' de Java: tutorial amb exemples de codi
- Interfície Java i tutoria de classes abstractes amb exemples
- Tutorial JAVA per a principiants: més de 100 tutorials pràctics de vídeo Java
- Desplegament de Java: creació i execució del fitxer JAR de Java
- C ++ contra Java: les 30 diferències principals entre C ++ i Java amb exemples
- MongoDB Sort () Mètode amb exemples
- Exploreu els aspectes bàsics de Java al seleni amb exemples