Java 8 - Guía rápida
Java 8:descripción general
JAVA 8 es una versión importante del desarrollo del lenguaje de programación JAVA. Su versión inicial se lanzó el 18 de marzo de 2014. Con el lanzamiento de Java 8, Java proporcionó soporte para programación funcional, nuevo motor de JavaScript, nuevas API para manipulación de fecha y hora, nueva API de transmisión, etc.
Nuevas funciones
-
Expresión lambda − Agrega capacidad de procesamiento funcional a Java.
-
Referencias de métodos − Referenciar funciones por sus nombres en lugar de invocarlas directamente. Usando funciones como parámetro.
-
Método predeterminado − Interfaz para implementar el método por defecto.
-
Nuevas herramientas − Se agregan nuevas herramientas y utilidades de compilación como 'jdeps' para descubrir dependencias.
-
API de transmisión − Nueva API de transmisión para facilitar el procesamiento de canalizaciones.
-
API de fecha y hora − API de fecha y hora mejorada.
-
Opcional − Énfasis en las mejores prácticas para manejar valores nulos correctamente.
-
Nashorn, motor JavaScript − Un motor basado en Java para ejecutar código JavaScript.
Considere el siguiente fragmento de código.
Demostración en vivoimport java.util.Collections; import java.util.List; import java.util.ArrayList; import java.util.Comparator; public class Java8Tester { public static void main(String args[]) { List<String> names1 = new ArrayList<String>(); names1.add("Mahesh "); names1.add("Suresh "); names1.add("Ramesh "); names1.add("Naresh "); names1.add("Kalpesh "); List<String> names2 = new ArrayList<String>(); names2.add("Mahesh "); names2.add("Suresh "); names2.add("Ramesh "); names2.add("Naresh "); names2.add("Kalpesh "); Java8Tester tester = new Java8Tester(); System.out.println("Sort using Java 7 syntax: "); tester.sortUsingJava7(names1); System.out.println(names1); System.out.println("Sort using Java 8 syntax: "); tester.sortUsingJava8(names2); System.out.println(names2); } //sort using java 7 private void sortUsingJava7(List<String> names) { Collections.sort(names, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.compareTo(s2); } }); } //sort using java 8 private void sortUsingJava8(List<String> names) { Collections.sort(names, (s1, s2) -> s1.compareTo(s2)); } }
Ejecute el programa para obtener el siguiente resultado.
Sort using Java 7 syntax: [ Kalpesh Mahesh Naresh Ramesh Suresh ] Sort using Java 8 syntax: [ Kalpesh Mahesh Naresh Ramesh Suresh ]
Aquí el sortUsingJava8() El método utiliza la función de clasificación con una expresión lambda como parámetro para obtener los criterios de clasificación.
Java 8 - Configuración del entorno
Configuración del entorno local
Si desea configurar su propio entorno para el lenguaje de programación Java, esta sección lo guiará a través de todo el proceso. Siga los pasos que se indican a continuación para configurar su entorno Java.
Java SE se puede descargar de forma gratuita desde el siguiente enlace −
https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
Descargas una versión basada en tu sistema operativo.
Siga las instrucciones para descargar Java y ejecute el .exe para instalar Java en su máquina. Una vez que haya instalado Java en su máquina, deberá configurar las variables de entorno para que apunten a los directorios de instalación correctos.
Configuración de la ruta para Windows 2000/XP
Suponiendo que haya instalado Java en el directorio c:\Program Files\java\jdk −
-
Haga clic derecho en 'Mi PC' y seleccione 'Propiedades'.
-
Haga clic en el botón 'Variables de entorno' en la pestaña 'Avanzado'.
-
Ahora, modifique la variable 'Ruta' para que también contenga la ruta al ejecutable de Java. Por ejemplo, si la ruta está establecida actualmente en 'C:\WINDOWS\SYSTEM32', cambie su ruta para que diga 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'.
Configuración de la ruta para Windows 95/98/ME
Suponiendo que haya instalado Java en el directorio c:\Program Files\java\jdk −
-
Edite el archivo 'C:\autoexec.bat' y agregue la siguiente línea al final −
SET PATH=%PATH%;C:\Archivos de programa\java\jdk\bin
Configuración de la ruta para Linux, UNIX, Solaris, FreeBSD
La variable de entorno PATH debe configurarse para señalar dónde se han instalado los archivos binarios de Java. Consulte la documentación de su shell si tiene problemas para hacerlo.
Por ejemplo, si usa bash como shell, entonces agregaría la siguiente línea al final de su '.bashrc:export PATH=/path/to/java:$PATH'
Editores populares de Java
Para escribir programas Java, necesita un editor de texto. Hay IDE aún más sofisticados disponibles en el mercado. Pero por ahora, puedes considerar uno de los siguientes −
-
Bloc de notas − En una máquina con Windows, puede usar cualquier editor de texto simple como el Bloc de notas (recomendado para este tutorial) o TextPad.
-
Netbeans − Es un IDE de Java que es de código abierto y gratuito. Se puede descargar desde https://netbeans.org/index.html.
-
Eclipse − También es un IDE de Java desarrollado por la comunidad de código abierto de Eclipse y se puede descargar desde https://www.eclipse.org/.
Java 8 - Expresiones lambda
Las expresiones lambda se introducen en Java 8 y se promocionan como la característica más importante de Java 8. La expresión lambda facilita la programación funcional y simplifica mucho el desarrollo.
Sintaxis
Una expresión lambda se caracteriza por la siguiente sintaxis.
parameter -> expression body
Las siguientes son las características importantes de una expresión lambda.
-
Declaración de tipo opcional − No es necesario declarar el tipo de un parámetro. El compilador puede inferir lo mismo a partir del valor del parámetro.
-
Paréntesis opcional alrededor del parámetro − No es necesario declarar un solo parámetro entre paréntesis. Para varios parámetros, se requieren paréntesis.
-
llaves opcionales − No es necesario usar llaves en el cuerpo de la expresión si el cuerpo contiene una sola declaración.
-
Palabra clave de retorno opcional − El compilador devuelve automáticamente el valor si el cuerpo tiene una sola expresión para devolver el valor. Se requieren llaves para indicar que la expresión devuelve un valor.
Ejemplo de expresiones lambda
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivopublic class Java8Tester { public static void main(String args[]) { Java8Tester tester = new Java8Tester(); //with type declaration MathOperation addition = (int a, int b) -> a + b; //with out type declaration MathOperation subtraction = (a, b) -> a - b; //with return statement along with curly braces MathOperation multiplication = (int a, int b) -> { return a * b; }; //without return statement and without curly braces MathOperation division = (int a, int b) -> a / b; System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); System.out.println("10 / 5 = " + tester.operate(10, 5, division)); //without parenthesis GreetingService greetService1 = message -> System.out.println("Hello " + message); //with parenthesis GreetingService greetService2 = (message) -> System.out.println("Hello " + message); greetService1.sayMessage("Mahesh"); greetService2.sayMessage("Suresh"); } interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } private int operate(int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello Mahesh Hello Suresh
Los siguientes son los puntos importantes a considerar en el ejemplo anterior.
-
Las expresiones lambda se utilizan principalmente para definir la implementación en línea de una interfaz funcional, es decir, una interfaz con un solo método. En el ejemplo anterior, hemos usado varios tipos de expresiones lambda para definir el método de operación de la interfaz MathOperation. Luego hemos definido la implementación de sayMessage de GreetingService.
-
La expresión Lambda elimina la necesidad de una clase anónima y brinda una capacidad de programación funcional muy simple pero poderosa para Java.
Alcance
Usando la expresión lambda, puede referirse a cualquier variable final o variable final efectiva (que se asigna solo una vez). La expresión lambda genera un error de compilación si se asigna un valor a una variable por segunda vez.
Ejemplo de alcance
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivopublic class Java8Tester { final static String salutation = "Hello! "; public static void main(String args[]) { GreetingService greetService1 = message -> System.out.println(salutation + message); greetService1.sayMessage("Mahesh"); } interface GreetingService { void sayMessage(String message); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Hello! Mahesh
Java 8 - Referencias de métodos
Las referencias a métodos ayudan a señalar los métodos por sus nombres. La referencia de un método se describe mediante el símbolo "::". Se puede usar una referencia de método para señalar los siguientes tipos de métodos −
- Métodos estáticos
- Métodos de instancia
- Constructores que utilizan el operador new (TreeSet::new)
Ejemplo de referencia del método
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
import java.util.List; import java.util.ArrayList; public class Java8Tester { public static void main(String args[]) { List names = new ArrayList(); names.add("Mahesh"); names.add("Suresh"); names.add("Ramesh"); names.add("Naresh"); names.add("Kalpesh"); names.forEach(System.out::println); } }
Aquí hemos pasado el método System.out::println como una referencia de método estático.
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Mahesh Suresh Ramesh Naresh Kalpesh
Java 8 - Interfaces funcionales
Las interfaces funcionales tienen una sola funcionalidad para exhibir. Por ejemplo, se utiliza una interfaz Comparable con un solo método 'compareTo' para fines de comparación. Java 8 ha definido una gran cantidad de interfaces funcionales para su uso extensivo en expresiones lambda. A continuación se muestra la lista de interfaces funcionales definidas en el paquete java.util.Function.
Sr.No. | Interfaz y descripción |
---|---|
1 |
BiConsumidor Representa una operación que acepta dos argumentos de entrada y no devuelve ningún resultado. |
2 |
Bifunción Representa una función que acepta dos argumentos y produce un resultado. |
3 |
Operador binario Representa una operación sobre dos operandos del mismo tipo, produciendo un resultado del mismo tipo que los operandos. |
4 |
Bipredicado Representa un predicado (función de valor booleano) de dos argumentos. |
5 | Suministrador booleano Representa un proveedor de resultados con valores booleanos. |
6 |
Consumidor Representa una operación que acepta un único argumento de entrada y no devuelve ningún resultado. |
7 | Operador binario doble Representa una operación sobre dos operandos de doble valor y produce un resultado de doble valor. |
8 | Consumidor doble Representa una operación que acepta un único argumento de doble valor y no devuelve ningún resultado. |
9 |
Doble Función Representa una función que acepta un argumento de valor doble y produce un resultado. |
10 | Doble Predicado Representa un predicado (función de valor booleano) de un argumento de valor doble. |
11 | Doble proveedor Representa un proveedor de resultados de doble valor. |
12 | FunciónDoubleToInt Representa una función que acepta un argumento de valor doble y produce un resultado de valor entero. |
13 | FunciónDobleALargo Representa una función que acepta un argumento de valor doble y produce un resultado de valor largo. |
14 | Operador UnarioDoble Representa una operación en un solo operando de doble valor que produce un resultado de doble valor. |
15 |
Función Representa una función que acepta un argumento y produce un resultado. |
16 | OperadorBinarioInt Representa una operación sobre dos operandos de valor int y produce un resultado de valor int. |
17 | ConsumidorInterno Representa una operación que acepta un único argumento de valor entero y no devuelve ningún resultado. |
18 |
FunciónInt Representa una función que acepta un argumento de valor entero y produce un resultado. |
19 | PredicadoInt Representa un predicado (función de valor booleano) de un argumento de valor entero. |
20 | ProveedorInterno Representa a un proveedor de resultados de valor internacional. |
21 | IntToDoubleFunction Representa una función que acepta un argumento de valor entero y produce un resultado de valor doble. |
22 | FunciónIntToLong Representa una función que acepta un argumento de valor entero y produce un resultado de valor largo. |
23 | OperadorIntUnario Representa una operación en un solo operando de valor int que produce un resultado de valor int. |
24 | Operador binario largo Representa una operación sobre dos operandos de valor largo y produce un resultado de valor largo. |
25 | Consumidor largo Representa una operación que acepta un único argumento de valor largo y no devuelve ningún resultado. |
26 |
Función Larga Representa una función que acepta un argumento de valor largo y produce un resultado. |
27 | Predicado largo Representa un predicado (función de valor booleano) de un argumento de valor largo. |
28 | Proveedor largo Representa un proveedor de resultados valiosos a largo plazo. |
29 | Función Larga ADoble Representa una función que acepta un argumento de valor largo y produce un resultado de valor doble. |
30 | FunciónLongToInt Representa una función que acepta un argumento de valor largo y produce un resultado de valor entero. |
31 | Operador Unario Largo Representa una operación en un solo operando de valor largo que produce un resultado de valor largo. |
32 |
ObjConsumidorDoble Representa una operación que acepta un argumento de valor de objeto y de valor doble, y no devuelve ningún resultado. |
33 |
ObjIntConsumidor Representa una operación que acepta un argumento con valor de objeto y con valor de entero, y no devuelve ningún resultado. |
34 |
ObjLongConsumer Representa una operación que acepta un argumento con valor de objeto y uno de valor largo, y no devuelve ningún resultado. |
35 |
Predicado Representa un predicado (función de valor booleano) de un argumento. |
36 |
Proveedor Representa un proveedor de resultados. |
37 |
ADobleBiFunción Representa una función que acepta dos argumentos y produce un resultado de doble valor. |
38 |
ADobleFunción Representa una función que produce un resultado de valor doble. |
39 |
AIntBiFunción Representa una función que acepta dos argumentos y produce un resultado de valor entero. |
40 |
AFunciónInt Representa una función que produce un resultado de valor entero. |
41 |
ALaBiFunciónLarga Representa una función que acepta dos argumentos y produce un resultado de valor largo. |
42 |
AFunciónLarga Representa una función que produce un resultado de valor largo. |
43 |
Operador Unario Representa una operación en un solo operando que produce un resultado del mismo tipo que su operando. |
Ejemplo de interfaz funcional
La interfaz de predicado
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.util.Arrays; import java.util.List; import java.util.function.Predicate; public class Java8Tester { public static void main(String args[]) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // Predicate<Integer> predicate = n -> true // n is passed as parameter to test method of Predicate interface // test method will always return true no matter what value n has. System.out.println("Print all numbers:"); //pass n as parameter eval(list, n->true); // Predicate<Integer> predicate1 = n -> n%2 == 0 // n is passed as parameter to test method of Predicate interface // test method will return true if n%2 comes to be zero System.out.println("Print even numbers:"); eval(list, n-> n%2 == 0 ); // Predicate<Integer> predicate2 = n -> n > 3 // n is passed as parameter to test method of Predicate interface // test method will return true if n is greater than 3. System.out.println("Print numbers greater than 3:"); eval(list, n-> n > 3 ); } public static void eval(List<Integer> list, Predicate<Integer> predicate) { for(Integer n: list) { if(predicate.test(n)) { System.out.println(n + " "); } } } }
Aquí hemos pasado la interfaz Predicate, que toma una sola entrada y devuelve Boolean.
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Print all numbers: 1 2 3 4 5 6 7 8 9 Print even numbers: 2 4 6 8 Print numbers greater than 3: 4 5 6 7 8 9
Java 8 - Métodos predeterminados
Java 8 introduce un nuevo concepto de implementación de métodos predeterminados en las interfaces. Esta capacidad se agrega para la compatibilidad con versiones anteriores, de modo que las interfaces antiguas se puedan usar para aprovechar la capacidad de expresión lambda de Java 8.
Por ejemplo, las interfaces 'Lista' o 'Colección' no tienen declaración de método 'forEach'. Por lo tanto, agregar dicho método simplemente romperá las implementaciones del marco de la colección. Java 8 introduce el método predeterminado para que la interfaz Lista/Colección pueda tener una implementación predeterminada del método forEach, y la clase que implementa estas interfaces no necesita implementar lo mismo.
Sintaxis
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } }
Múltiples valores predeterminados
Con funciones predeterminadas en las interfaces, existe la posibilidad de que una clase esté implementando dos interfaces con los mismos métodos predeterminados. El siguiente código explica cómo se puede resolver esta ambigüedad.
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } } public interface fourWheeler { default void print() { System.out.println("I am a four wheeler!"); } }
La primera solución es crear un método propio que anule la implementación predeterminada.
public class car implements vehicle, fourWheeler { public void print() { System.out.println("I am a four wheeler car vehicle!"); } }
La segunda solución es llamar al método predeterminado de la interfaz especificada usando super.
public class car implements vehicle, fourWheeler { public void print() { vehicle.super.print(); } }
Métodos predeterminados estáticos
Una interfaz también puede tener métodos auxiliares estáticos desde Java 8 en adelante.
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } static void blowHorn() { System.out.println("Blowing horn!!!"); } }
Ejemplo de método predeterminado
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivopublic class Java8Tester { public static void main(String args[]) { Vehicle vehicle = new Car(); vehicle.print(); } } interface Vehicle { default void print() { System.out.println("I am a vehicle!"); } static void blowHorn() { System.out.println("Blowing horn!!!"); } } interface FourWheeler { default void print() { System.out.println("I am a four wheeler!"); } } class Car implements Vehicle, FourWheeler { public void print() { Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("I am a car!"); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
I am a vehicle! I am a four wheeler! Blowing horn!!! I am a car!
Java 8 - Flujos
Stream es una nueva capa abstracta introducida en Java 8. Usando stream, puede procesar datos de una manera declarativa similar a las declaraciones SQL. Por ejemplo, considere la siguiente instrucción SQL.
SELECT max(salary), employee_id, employee_name FROM Employee
La expresión SQL anterior devuelve automáticamente los detalles del empleado asalariado máximo, sin realizar ningún cálculo por parte del desarrollador. Usando el marco de colecciones en Java, un desarrollador tiene que usar bucles y realizar comprobaciones repetidas. Otra preocupación es la eficiencia; como los procesadores multinúcleo están disponibles fácilmente, un desarrollador de Java tiene que escribir un procesamiento de código paralelo que puede ser bastante propenso a errores.
Para resolver estos problemas, Java 8 introdujo el concepto de flujo que permite al desarrollador procesar datos de forma declarativa y aprovechar la arquitectura multinúcleo sin necesidad de escribir ningún código específico para ello.
¿Qué es Corriente?
Stream representa una secuencia de objetos de una fuente, que admite operaciones agregadas. Las siguientes son las características de un Stream −
-
Secuencia de elementos − Un flujo proporciona un conjunto de elementos de tipo específico de manera secuencial. Una secuencia obtiene/calcula elementos a pedido. Nunca almacena los elementos.
-
Fuente − Stream toma colecciones, arreglos o recursos de E/S como fuente de entrada.
-
Operaciones agregadas − Stream admite operaciones agregadas como filtrar, mapear, limitar, reducir, buscar, unir, etc.
-
Canalización − La mayoría de las operaciones de flujo devuelven el flujo en sí mismo para que su resultado pueda canalizarse. Estas operaciones se denominan operaciones intermedias y su función es tomar entradas, procesarlas y devolver la salida al destino. El método collect() es una operación de terminal que normalmente está presente al final de la operación de canalización para marcar el final de la transmisión.
-
Iteraciones automáticas − Las operaciones de transmisión realizan las iteraciones internamente sobre los elementos de origen proporcionados, en contraste con las colecciones, donde se requiere una iteración explícita.
Generando flujos
Con Java 8, la interfaz de colección tiene dos métodos para generar un Stream.
-
flujo() − Devuelve un flujo secuencial considerando la colección como su fuente.
-
flujo paralelo() − Devuelve un Stream paralelo considerando la colección como su fuente.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
paraCada
Stream ha proporcionado un nuevo método 'forEach' para iterar cada elemento de la secuencia. El siguiente segmento de código muestra cómo imprimir 10 números aleatorios usando forEach.
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
mapa
El método 'map' se usa para mapear cada elemento a su resultado correspondiente. El siguiente segmento de código imprime cuadrados únicos de números usando el mapa.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //get list of unique squares List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
filtro
El método de 'filtro' se utiliza para eliminar elementos en función de un criterio. El siguiente segmento de código imprime un recuento de cadenas vacías mediante filtro.
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); //get count of empty string int count = strings.stream().filter(string -> string.isEmpty()).count();
límite
El método de "límite" se utiliza para reducir el tamaño de la corriente. El siguiente segmento de código muestra cómo imprimir 10 números aleatorios usando el límite.
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
ordenado
El método 'ordenado' se utiliza para ordenar el flujo. El siguiente segmento de código muestra cómo imprimir 10 números aleatorios en un orden ordenado.
Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);
Procesamiento en paralelo
ParallelStream es la alternativa de flujo para el procesamiento paralelo. Eche un vistazo al siguiente segmento de código que imprime un recuento de cadenas vacías utilizando ParalelStream.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); //get count of empty string long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
Es muy fácil cambiar entre flujos secuenciales y paralelos.
Coleccionistas
Los recopiladores se utilizan para combinar el resultado del procesamiento de los elementos de un flujo. Los recopiladores se pueden usar para devolver una lista o una cadena.
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("Filtered List: " + filtered); String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("Merged String: " + mergedString);
Estadísticas
Con Java 8, se introducen recopiladores de estadísticas para calcular todas las estadísticas cuando se realiza el procesamiento de secuencias.
List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("Highest number in List : " + stats.getMax()); System.out.println("Lowest number in List : " + stats.getMin()); System.out.println("Sum of all numbers : " + stats.getSum()); System.out.println("Average of all numbers : " + stats.getAverage());
Ejemplo de transmisión
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.util.ArrayList; import java.util.Arrays; import java.util.IntSummaryStatistics; import java.util.List; import java.util.Random; import java.util.stream.Collectors; import java.util.Map; public class Java8Tester { public static void main(String args[]) { System.out.println("Using Java 7: "); // Count empty strings List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); System.out.println("List: " +strings); long count = getCountEmptyStringUsingJava7(strings); System.out.println("Empty Strings: " + count); count = getCountLength3UsingJava7(strings); System.out.println("Strings of length 3: " + count); //Eliminate empty string List<String> filtered = deleteEmptyStringsUsingJava7(strings); System.out.println("Filtered List: " + filtered); //Eliminate empty string and join using comma. String mergedString = getMergedStringUsingJava7(strings,", "); System.out.println("Merged String: " + mergedString); List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //get list of square of distinct numbers List<Integer> squaresList = getSquares(numbers); System.out.println("Squares List: " + squaresList); List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19); System.out.println("List: " +integers); System.out.println("Highest number in List : " + getMax(integers)); System.out.println("Lowest number in List : " + getMin(integers)); System.out.println("Sum of all numbers : " + getSum(integers)); System.out.println("Average of all numbers : " + getAverage(integers)); System.out.println("Random Numbers: "); //print ten random numbers Random random = new Random(); for(int i = 0; i < 10; i++) { System.out.println(random.nextInt()); } System.out.println("Using Java 8: "); System.out.println("List: " +strings); count = strings.stream().filter(string->string.isEmpty()).count(); System.out.println("Empty Strings: " + count); count = strings.stream().filter(string -> string.length() == 3).count(); System.out.println("Strings of length 3: " + count); filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList()); System.out.println("Filtered List: " + filtered); mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("Merged String: " + mergedString); squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList()); System.out.println("Squares List: " + squaresList); System.out.println("List: " +integers); IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics(); System.out.println("Highest number in List : " + stats.getMax()); System.out.println("Lowest number in List : " + stats.getMin()); System.out.println("Sum of all numbers : " + stats.getSum()); System.out.println("Average of all numbers : " + stats.getAverage()); System.out.println("Random Numbers: "); random.ints().limit(10).sorted().forEach(System.out::println); //parallel processing count = strings.parallelStream().filter(string -> string.isEmpty()).count(); System.out.println("Empty Strings: " + count); } private static int getCountEmptyStringUsingJava7(List<String> strings) { int count = 0; for(String string: strings) { if(string.isEmpty()) { count++; } } return count; } private static int getCountLength3UsingJava7(List<String> strings) { int count = 0; for(String string: strings) { if(string.length() == 3) { count++; } } return count; } private static List<String> deleteEmptyStringsUsingJava7(List<String> strings) { List<String> filteredList = new ArrayList<String>(); for(String string: strings) { if(!string.isEmpty()) { filteredList.add(string); } } return filteredList; } private static String getMergedStringUsingJava7(List<String> strings, String separator) { StringBuilder stringBuilder = new StringBuilder(); for(String string: strings) { if(!string.isEmpty()) { stringBuilder.append(string); stringBuilder.append(separator); } } String mergedString = stringBuilder.toString(); return mergedString.substring(0, mergedString.length()-2); } private static List<Integer> getSquares(List<Integer> numbers) { List<Integer> squaresList = new ArrayList<Integer>(); for(Integer number: numbers) { Integer square = new Integer(number.intValue() * number.intValue()); if(!squaresList.contains(square)) { squaresList.add(square); } } return squaresList; } private static int getMax(List<Integer> numbers) { int max = numbers.get(0); for(int i = 1;i < numbers.size();i++) { Integer number = numbers.get(i); if(number.intValue() > max) { max = number.intValue(); } } return max; } private static int getMin(List<Integer> numbers) { int min = numbers.get(0); for(int i= 1;i < numbers.size();i++) { Integer number = numbers.get(i); if(number.intValue() < min) { min = number.intValue(); } } return min; } private static int getSum(List numbers) { int sum = (int)(numbers.get(0)); for(int i = 1;i < numbers.size();i++) { sum += (int)numbers.get(i); } return sum; } private static int getAverage(List<Integer> numbers) { return getSum(numbers) / numbers.size(); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Using Java 7: List: [abc, , bc, efg, abcd, , jkl] Empty Strings: 2 Strings of length 3: 3 Filtered List: [abc, bc, efg, abcd, jkl] Merged String: abc, bc, efg, abcd, jkl Squares List: [9, 4, 49, 25] List: [1, 2, 13, 4, 15, 6, 17, 8, 19] Highest number in List : 19 Lowest number in List : 1 Sum of all numbers : 85 Average of all numbers : 9 Random Numbers: -1279735475 903418352 -1133928044 -1571118911 628530462 18407523 -881538250 -718932165 270259229 421676854 Using Java 8: List: [abc, , bc, efg, abcd, , jkl] Empty Strings: 2 Strings of length 3: 3 Filtered List: [abc, bc, efg, abcd, jkl] Merged String: abc, bc, efg, abcd, jkl Squares List: [9, 4, 49, 25] List: [1, 2, 13, 4, 15, 6, 17, 8, 19] Highest number in List : 19 Lowest number in List : 1 Sum of all numbers : 85 Average of all numbers : 9.444444444444445 Random Numbers: -1009474951 -551240647 -2484714 181614550 933444268 1227850416 1579250773 1627454872 1683033687 1798939493 Empty Strings: 2
Java 8 - Clase opcional
Opcional es un objeto contenedor que se usa para contener objetos no nulos. El objeto opcional se usa para representar nulo con valor ausente. Esta clase tiene varios métodos de utilidad para facilitar que el código maneje valores como "disponibles" o "no disponibles" en lugar de verificar valores nulos. Se introduce en Java 8 y es similar a Opcional en Guava.
Declaración de clase
La siguiente es la declaración para java.util.Optional
public final class Optional<T> extends Object
Método de clase
Sr.No. | Método y descripción |
---|---|
1 |
estática Devuelve una instancia opcional vacía. |
2 | igual booleano(Objeto obj) Indica si algún otro objeto es "igual a" este Opcional. |
3 |
Filtro Si un valor está presente y el valor coincide con un predicado determinado, devuelve un Opcional que describe el valor; de lo contrario, devuelve un Opcional vacío. |
4 | Opcional flatMap(Función super T, Opcional> mapeador) Si hay un valor presente, se le aplica la función de mapeo de orientación opcional proporcionada, devuelve ese resultado; de lo contrario, devuelve un valor opcional vacío. |
5 | T get() Si un valor está presente en este Opcional, devuelve el valor; de lo contrario, arroja NoSuchElementException. |
6 | código hash int() Devuelve el valor del código hash del valor actual, si lo hay, o 0 (cero) si no hay ningún valor presente. |
7 | void ifPresent(Consumidor super T> consumidor) Si hay un valor presente, invoca al consumidor especificado con el valor; de lo contrario, no hace nada. |
8 | booleano está presente() Devuelve verdadero si hay un valor presente; de lo contrario, devuelve falso. |
9 | Mapa opcional (Función super T,? extiende U> mapeador) Si hay un valor presente, se le aplica la función de asignación proporcionada y, si el resultado no es nulo, devuelve un Opcional que describe el resultado. |
10 |
Devuelve un Opcional con el valor actual no nulo especificado. |
11 |
Devuelve un Opcional que describe el valor especificado, si no es nulo; de lo contrario, devuelve un Opcional vacío. |
12 | T orElse(T otro) Devuelve el valor si está presente; de lo contrario, devuelve otro. |
13 | T orElseGet(Proveedor extiende T> otro) Devuelve el valor si está presente, de lo contrario invoca otro y devuelve el resultado de esa invocación. |
14 |
Devuelve el valor contenido, si está presente; de lo contrario, genera una excepción que debe crear el proveedor proporcionado. |
15 | Cadena a Cadena() Devuelve una representación de cadena no vacía de este opcional adecuado para la depuración. |
Esta clase hereda métodos de la siguiente clase −
- java.lang.Objeto
Ejemplo opcional
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.util.Optional; public class Java8Tester { public static void main(String args[]) { Java8Tester java8Tester = new Java8Tester(); Integer value1 = null; Integer value2 = new Integer(10); //Optional.ofNullable - allows passed parameter to be null. Optional<Integer> a = Optional.ofNullable(value1); //Optional.of - throws NullPointerException if passed parameter is null Optional<Integer> b = Optional.of(value2); System.out.println(java8Tester.sum(a,b)); } public Integer sum(Optional<Integer> a, Optional<Integer> b) { //Optional.isPresent - checks the value is present or not System.out.println("First parameter is present: " + a.isPresent()); System.out.println("Second parameter is present: " + b.isPresent()); //Optional.orElse - returns the value if present otherwise returns //the default value passed. Integer value1 = a.orElse(new Integer(0)); //Optional.get - gets the value, value should be present Integer value2 = b.get(); return value1 + value2; } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
First parameter is present: false Second parameter is present: true 10
Java 8 - JavaScript Nashorn
Con Java 8, Nashorn, se presenta un motor javascript muy mejorado para reemplazar el Rhino existente. Nashorn proporciona un rendimiento de 2 a 10 veces mejor, ya que compila directamente el código en la memoria y pasa el código de bytes a JVM. Nashorn utiliza la característica de dinámica de invocación, introducida en Java 7 para mejorar el rendimiento.
jjs
Para el motor Nashorn, JAVA 8 presenta una nueva herramienta de línea de comandos, jjs, para ejecutar códigos javascript en la consola.
Interpretación del archivo js
Cree y guarde el archivo sample.js en c:\> Carpeta JAVA.
muestra.js
print('Hello World!');
Abra la consola y use el siguiente comando.
C:\JAVA>jjs sample.js
Producirá el siguiente resultado:
Hello World!
jjs en modo interactivo
Abra la consola y use el siguiente comando.
C:\JAVA>jjs jjs> print("Hello, World!") Hello, World! jjs> quit() >>
Aprobar argumentos
Abra la consola y use el siguiente comando.
C:\JAVA> jjs -- a b c jjs> print('letters: ' +arguments.join(", ")) letters: a, b, c jjs>
Llamar JavaScript desde Java
Usando ScriptEngineManager, el código JavaScript se puede llamar e interpretar en Java.
Ejemplo
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; public class Java8Tester { public static void main(String args[]) { ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn"); String name = "Mahesh"; Integer result = null; try { nashorn.eval("print('" + name + "')"); result = (Integer) nashorn.eval("10 + 2"); } catch(ScriptException e) { System.out.println("Error executing script: "+ e.getMessage()); } System.out.println(result.toString()); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Mahesh 12
Llamar a Java desde JavaScript
El siguiente ejemplo explica cómo importar y usar clases de Java en java script.
Cree y guarde sample.js en c:\> Carpeta JAVA.
muestra.js
var BigDecimal = Java.type('java.math.BigDecimal'); function calculate(amount, percentage) { var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide( new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN); return result.toPlainString(); } var result = calculate(568000000000000000023,13.9); print(result);
Abra la consola y use el siguiente comando.
C:\JAVA>jjs sample.js
Debería producir el siguiente resultado −
78952000000000000003.20
Java 8 - Nueva API de fecha/hora
Con Java 8, se presenta una nueva API de fecha y hora para cubrir los siguientes inconvenientes de la antigua API de fecha y hora.
-
No es seguro para subprocesos − java.util.Date no es seguro para subprocesos, por lo que los desarrolladores tienen que lidiar con el problema de concurrencia al usar la fecha. La nueva API de fecha y hora es inmutable y no tiene métodos de establecimiento.
-
Diseño deficiente − La fecha predeterminada comienza en 1900, el mes comienza en 1 y el día comienza en 0, por lo que no hay uniformidad. La antigua API tenía métodos menos directos para las operaciones de fecha. La nueva API proporciona numerosos métodos de utilidad para tales operaciones.
-
Manejo de zona horaria difícil − Los desarrolladores tuvieron que escribir mucho código para lidiar con los problemas de la zona horaria. La nueva API se ha desarrollado teniendo en cuenta el diseño específico del dominio.
Java 8 presenta una nueva API de fecha y hora bajo el paquete java.time. Las siguientes son algunas de las clases importantes introducidas en el paquete java.time.
-
Locales − API de fecha y hora simplificada sin complejidad en el manejo de la zona horaria.
-
Zonificado − API de fecha y hora especializada para manejar varias zonas horarias.
API de fecha y hora local
Las clases LocalDate/LocalTime y LocalDateTime simplifican el desarrollo donde no se requieren zonas horarias. Veámoslos en acción.
Cree el siguiente programa java usando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.time.LocalDate; import java.time.LocalTime; import java.time.LocalDateTime; import java.time.Month; public class Java8Tester { public static void main(String args[]) { Java8Tester java8tester = new Java8Tester(); java8tester.testLocalDateTime(); } public void testLocalDateTime() { // Get the current date and time LocalDateTime currentTime = LocalDateTime.now(); System.out.println("Current DateTime: " + currentTime); LocalDate date1 = currentTime.toLocalDate(); System.out.println("date1: " + date1); Month month = currentTime.getMonth(); int day = currentTime.getDayOfMonth(); int seconds = currentTime.getSecond(); System.out.println("Month: " + month +"day: " + day +"seconds: " + seconds); LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012); System.out.println("date2: " + date2); //12 december 2014 LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12); System.out.println("date3: " + date3); //22 hour 15 minutes LocalTime date4 = LocalTime.of(22, 15); System.out.println("date4: " + date4); //parse a string LocalTime date5 = LocalTime.parse("20:15:30"); System.out.println("date5: " + date5); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Current DateTime: 2014-12-09T11:00:45.457 date1: 2014-12-09 Month: DECEMBERday: 9seconds: 45 date2: 2012-12-10T11:00:45.457 date3: 2014-12-12 date4: 22:15 date5: 20:15:30
API de fecha y hora por zonas
La API de fecha y hora dividida en zonas se utilizará cuando se considere la zona horaria. Veámoslos en acción.
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]) { Java8Tester java8tester = new Java8Tester(); java8tester.testZonedDateTime(); } public void testZonedDateTime() { // Get the current date and time ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]"); System.out.println("date1: " + date1); ZoneId id = ZoneId.of("Europe/Paris"); System.out.println("ZoneId: " + id); ZoneId currentZone = ZoneId.systemDefault(); System.out.println("CurrentZone: " + currentZone); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
date1: 2007-12-03T10:15:30+05:00[Asia/Karachi] ZoneId: Europe/Paris CurrentZone: Etc/UTC
Enumeración de unidades de crono
La enumeración java.time.temporal.ChronoUnit se agrega en Java 8 para reemplazar los valores enteros utilizados en la antigua API para representar el día, el mes, etc. Veámoslos en acción.
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.time.LocalDate; import java.time.temporal.ChronoUnit; public class Java8Tester { public static void main(String args[]) { Java8Tester java8tester = new Java8Tester(); java8tester.testChromoUnits(); } public void testChromoUnits() { //Get the current date LocalDate today = LocalDate.now(); System.out.println("Current date: " + today); //add 1 week to the current date LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); System.out.println("Next week: " + nextWeek); //add 1 month to the current date LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS); System.out.println("Next month: " + nextMonth); //add 1 year to the current date LocalDate nextYear = today.plus(1, ChronoUnit.YEARS); System.out.println("Next year: " + nextYear); //add 10 years to the current date LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES); System.out.println("Date after ten year: " + nextDecade); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Current date: 2014-12-10 Next week: 2014-12-17 Next month: 2015-01-10 Next year: 2015-12-10 Date after ten year: 2024-12-10
Período y Duración
Con Java 8, se introducen dos clases especializadas para hacer frente a las diferencias horarias.
-
Período − Se trata de la cantidad de tiempo basada en la fecha.
-
Duración − Se trata de la cantidad de tiempo basada en el tiempo.
Veámoslos en acción.
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.time.temporal.ChronoUnit; import java.time.LocalDate; import java.time.LocalTime; import java.time.Duration; import java.time.Period; public class Java8Tester { public static void main(String args[]) { Java8Tester java8tester = new Java8Tester(); java8tester.testPeriod(); java8tester.testDuration(); } public void testPeriod() { //Get the current date LocalDate date1 = LocalDate.now(); System.out.println("Current date: " + date1); //add 1 month to the current date LocalDate date2 = date1.plus(1, ChronoUnit.MONTHS); System.out.println("Next month: " + date2); Period period = Period.between(date2, date1); System.out.println("Period: " + period); } public void testDuration() { LocalTime time1 = LocalTime.now(); Duration twoHours = Duration.ofHours(2); LocalTime time2 = time1.plus(twoHours); Duration duration = Duration.between(time1, time2); System.out.println("Duration: " + duration); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Current date: 2014-12-10 Next month: 2015-01-10 Period: P-1M Duration: PT2H
Ajustadores Temporales
TemporalAdjuster se utiliza para realizar las matemáticas de fecha. Por ejemplo, obtenga el "Segundo sábado del mes" o "Próximo martes". Veámoslos en acción.
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import java.time.DayOfWeek; public class Java8Tester { public static void main(String args[]) { Java8Tester java8tester = new Java8Tester(); java8tester.testAdjusters(); } public void testAdjusters() { //Get the current date LocalDate date1 = LocalDate.now(); System.out.println("Current date: " + date1); //get the next tuesday LocalDate nextTuesday = date1.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)); System.out.println("Next Tuesday on : " + nextTuesday); //get the second saturday of next month LocalDate firstInYear = LocalDate.of(date1.getYear(),date1.getMonth(), 1); LocalDate secondSaturday = firstInYear.with(TemporalAdjusters.nextOrSame( DayOfWeek.SATURDAY)).with(TemporalAdjusters.next(DayOfWeek.SATURDAY)); System.out.println("Second Saturday on : " + secondSaturday); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Current date: 2014-12-10 Next Tuesday on : 2014-12-16 Second Saturday on : 2014-12-13
Compatibilidad con versiones anteriores
Se agrega un método toInstant() a los objetos de fecha y calendario originales, que se puede usar para convertirlos a la nueva API de fecha y hora. Use un método ofInstant(Insant,ZoneId) para obtener un objeto LocalDateTime o ZonedDateTime. Veámoslos en acción.
Cree el siguiente programa Java utilizando cualquier editor de su elección en, por ejemplo, C:\> JAVA.
Java8Tester.java
Demostración en vivoimport java.time.LocalDateTime; import java.time.ZonedDateTime; import java.util.Date; import java.time.Instant; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]) { Java8Tester java8tester = new Java8Tester(); java8tester.testBackwardCompatability(); } public void testBackwardCompatability() { //Get the current date Date currentDate = new Date(); System.out.println("Current date: " + currentDate); //Get the instant of current date in terms of milliseconds Instant now = currentDate.toInstant(); ZoneId currentZone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone); System.out.println("Local date: " + localDateTime); ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone); System.out.println("Zoned date: " + zonedDateTime); } }
Verificar el resultado
Compile la clase usando javac compilador de la siguiente manera −
C:\JAVA>javac Java8Tester.java
Ahora ejecute Java8Tester de la siguiente manera −
C:\JAVA>java Java8Tester
Debería producir el siguiente resultado −
Current date: Wed Dec 10 05:44:06 UTC 2014 Local date: 2014-12-10T05:44:06.635 Zoned date: 2014-12-10T05:44:06.635Z[Etc/UTC]
Java 8 - Base64
Con Java 8, Base64 finalmente obtuvo su merecido. Java 8 ahora tiene un codificador y decodificador incorporado para la codificación Base64. En Java 8, podemos usar tres tipos de codificación Base64.
-
Sencillo − La salida se asigna a un conjunto de caracteres que se encuentran en A-Za-z0-9+/. El codificador no agrega ningún avance de línea en la salida y el decodificador rechaza cualquier carácter que no sea A-Za-z0-9+/.
-
URL − La salida se asigna al conjunto de caracteres que se encuentran en A-Za-z0-9+_. La salida es segura para la URL y el nombre de archivo.
-
MIME − La salida se asigna a un formato compatible con MIME. La salida se representa en líneas de no más de 76 caracteres cada una y utiliza un retorno de carro '\r' seguido de un salto de línea '\n' como separador de línea. No hay separador de línea al final de la salida codificada.
Clases anidadas
Sr.No. | Clase anidada y descripción |
---|---|
1 | clase estática Base64.Decoder Esta clase implementa un decodificador para decodificar datos de bytes usando el esquema de codificación Base64 como se especifica en RFC 4648 y RFC 2045. |
2 | clase estática Base64.Encoder Esta clase implementa un codificador para codificar datos de bytes usando el esquema de codificación Base64 como se especifica en RFC 4648 y RFC 2045. |
Métodos
Sr.No. | Method Name &Description |
---|---|
1 | static Base64.Decoder getDecoder() Returns a Base64.Decoder that decodes using the Basic type base64 encoding scheme. |
2 | static Base64.Encoder getEncoder() Returns a Base64.Encoder that encodes using the Basic type base64 encoding scheme. |
3 | static Base64.Decoder getMimeDecoder() Returns a Base64.Decoder that decodes using the MIME type base64 decoding scheme. |
4 | static Base64.Encoder getMimeEncoder() Returns a Base64.Encoder that encodes using the MIME type base64 encoding scheme. |
5 | static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator) Returns a Base64.Encoder that encodes using the MIME type base64 encoding scheme with specified line length and line separators. |
6 | static Base64.Decoder getUrlDecoder() Returns a Base64.Decoder that decodes using the URL and Filename safe type base64 encoding scheme. |
7 | static Base64.Encoder getUrlEncoder() Returns a Base64.Encoder that encodes using the URL and Filename safe type base64 encoding scheme. |
Methods Inherited
This class inherits methods from the following class −
- java.lang.Object
Base64 Example
Create the following Java program using any editor of your choice in say C:/> JAVA.
Java8Tester.java
Live Demoimport java.util.Base64; import java.util.UUID; import java.io.UnsupportedEncodingException; public class HelloWorld { public static void main(String args[]) { try { // Encode using basic encoder String base64encodedString = Base64.getEncoder().encodeToString( "TutorialsPoint?java8".getBytes("utf-8")); System.out.println("Base64 Encoded String (Basic) :" + base64encodedString); // Decode byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString); System.out.println("Original String: " + new String(base64decodedBytes, "utf-8")); base64encodedString = Base64.getUrlEncoder().encodeToString( "TutorialsPoint?java8".getBytes("utf-8")); System.out.println("Base64 Encoded String (URL) :" + base64encodedString); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < 10; ++i) { stringBuilder.append(UUID.randomUUID().toString()); } byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8"); String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes); System.out.println("Base64 Encoded String (MIME) :" + mimeEncodedString); } catch(UnsupportedEncodingException e) { System.out.println("Error :" + e.getMessage()); } } }
Verify the Result
Compile the class using javac compiler as follows −
C:\JAVA>javac Java8Tester.java
Now run the Java8Tester as follows −
C:\JAVA>java Java8Tester
It should produce the following output −
Base64 Encoded String (Basic) :VHV0b3JpYWxzUG9pbnQ/amF2YTg= Original String: TutorialsPoint?java8 Base64 Encoded String (URL) :VHV0b3JpYWxzUG9pbnQ_amF2YTg= Base64 Encoded String (MIME) :YmU3NWY2ODktNGM5YS00ODlmLWI2MTUtZTVkOTk2YzQ1Njk1Y2EwZTg2OTEtMmRiZC00YTQ1LWJl NTctMTI1MWUwMTk0ZWQyNDE0NDAwYjgtYTYxOS00NDY5LTllYTctNjc1YzE3YWJhZTk1MTQ2MDQz NDItOTAyOC00ZWI0LThlOTYtZWU5YzcwNWQyYzVhMTQxMWRjYTMtY2MwNi00MzU0LTg0MTgtNGQ1 MDkwYjdiMzg2ZTY0OWU5MmUtZmNkYS00YWEwLTg0MjQtYThiOTQxNDQ2YzhhNTVhYWExZjItNjU2 Mi00YmM4LTk2ZGYtMDE4YmY5ZDZhMjkwMzM3MWUzNDMtMmQ3MS00MDczLWI0Y2UtMTQxODE0MGU5 YjdmYTVlODUxYzItN2NmOS00N2UyLWIyODQtMThlMWVkYTY4M2Q1YjE3YTMyYmItZjllMS00MTFk LWJiM2UtM2JhYzUxYzI5OWI4
Java
- Java Vector
- Fresado:una guía rápida
- Guía rápida para el desarrollo y la ejecución de PM
- Una guía rápida de seguros para la interrupción de la cadena de suministro
- Una guía rápida para la máquina dobladora de tubos cuadrados
- Una guía rápida para la máquina de prensado en frío
- Una guía rápida para la caja de engranajes planetarios
- Una guía rápida para Jet Mill Drill
- Una guía rápida para la máquina de prensa servo
- Una guía rápida para cilindros neumáticos
- Una guía rápida para Gear Decoiler