SlideShare una empresa de Scribd logo
Java 8
Nuevas características
por Fernando Petrola
Tópicos:
1.Interfaces funcionales
2.Expresiones Lambda
3.Stream API
4.Nuevo motor de Javascript Nashorn
Interfaces funcionales
Functional Interface:
1. Es una Interface que tiene un solo método abstracto.
2. El annotation @FunctionalInterface se puede usar como
mecanismo de advertencia en la compilación.
3. Se suelen implementar métodos por defecto dentro.
4. Antes de crear una nueva mirar las predefinidas en
java.util.function.*
5. Los tipos de datos primitivos tienen interfaces funcionales
predefinidas específicas.
6. Son usadas en conjunto con expresiones lambdas
public interface ActionListener extends EventListener
{
public void actionPerformed(ActionEvent e);
}
public interface Callable<V>
{
public V call();
}
public interface Runnable
{
public void run();
}
public interface Comparator<T>
{
int compare(T o1, T o2);
boolean equals(Object obj);
}
Ejemplos de Functional Interfaces ya conocidas
• Supplier<T>: Devuelve un T
• Consumer<T>: Recibe un T
• BiConsumer<T, U>: Recibe un T y un U
• Predicate<T>: Evalua un T y devuelve un boolean
• Function<T, R>: Recive un T y devuelve un R
• BinaryOperator<T>: Recibe 2 T y devuelve un T
Functional Interfaces
Predefinidas genéricas
• (Int | Long | Double)Supplier
• (Int | Long | Double)Consumer
• (Int | Long | Double)Predicate
• (Int | Long | Double)Function<R>
• (Int | Long | Double)BinaryOperator
• Obj(Int | Long | Double)Consumer<T>
• (Int | Long | Double)To(Int | Long | Double)Function
Predefinidas para primitivos
Functional Interfaces
Default Methods
1.Permiten definir Interfaces que tengan algo de comportamiento.
2.Son heredados por las clases implementadoras
3.Al heredar más de una implementación del mismo método se
puede elegir cual usar en la subclase.
4.Facilitan “backward compatibility” de Collections
5.Solo interactúan con otros métodos y son “stateless”.
Ejemplo de default methods
public interface Predicate<T>
{
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other)
{
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate()
{
return (t) -> !test(t);
}
...
}
Default Methods
Herencia
public interface A
{
default public String foo()
{
return “A”;
}
}
public interface B
{
default public String foo()
{
return “B”;
}
}
public class AB implements A, B
{
public String foo()
{
return B.super.foo();
}
}
Preguntas sobre interfaces funcionales?
Seguimos con:
Expresiones Lambda
Expresiones Lambda
• Es un bloque de código
• Método anónimo
• Parecido al resultado obtenido con clases anónimas
• Termina creando una instancia de una interfaz funcional
Que es una expresión lambda?
Expresiones Lambda
• Código más compacto y limpio
• Da lugar al surgimiento de Streams API
• + declarativo, - implementativo
• Permite aplicar varias optimizaciones
• Inferencia de tipos
• Mismas reglas de scope que los bloques de código tradicionales
• Primer paso para la inclusión de programación funcional
Ventajas
Expresiones Lambda
• No son funciones reales, son métodos anónimos.
• Sólo permite capturar variables inmutables y miembros de la
clase.
• No se puede declarar la firma de una “funcion” anónima:
public static void runOperation((int -> int) operation) { ... }
Contras
Forma básica:
arg -> body
Forma extendida:
( T1 arg1, T2 arg2 ) -> { body }
Como es una expresión lambda?
new InterfaceA()
{
public T2 method1(T1 v1)
{
return result;
}
};
v1 -> result
Misma definición, diferentes expresiones
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(“click”);
}
});
El ejemplo más esperado.. JButton!
Con clases anónimas
button.addActionListener(e -> System.out.println(“click”));
Con lambdas
;
BinaryOperator<Integer> sumador= new BinaryOperator<Integer>()
{
public Integer apply(Integer v1, Integer v2)
{
return v1 + v2;
}
};
Inferencia de tipos, bloque de código, return
(Integer v1, Integer v2) -> { return v1 + v2; }
ó
(v1, v2) -> { return v1 + v2; }
ó
(v1, v2) -> v1 + v2
BinaryOperator<Integer> sumador=
Interfaces funcionales
// Asignacion
Predicate<String> p = String::isEmpty;
// Predicate creado en contexto de la invocacion
stream.filter(e -> e.getSize() > 10)...
// En casteo
stream.map((ToIntFunction) e -> e.getSize())...
// Comparator creado con lambda
String[] list= new String[] { "One", "Two", "Three", "Four", "Five", "Six" };
Arrays.sort(list, (a, b)->a.substring(1).compareTo(b.substring(1)));
Creadas a partir de lambdas
• Declaración de variables
• Asignaciones
• Instrucción “return”
• Inicializadores de Arrays
• Parámetros de métodos o constructores
• Cuerpo de un lambda
• Condicionales (?:)
• Casteos
Donde se pueden usar lambdas?
FileFilter[] filters= new FileFilter[] { f -> f.exists(), f -> f.getName().startsWith("q") };
Object o = (Runnable) () -> { System.out.println("hola"); };
Supplier<Runnable> c = () -> () -> { System.out.println("hola"); };
Callable<Integer> c = flag ? (() -> 23) : (() -> 42);
Ejemplos para destacar:
En contextos que tengan “target type”:
public class Hola
{
Runnable r1 = () -> { System.out.println(this); }
Runnable r2 = () -> { System.out.println(toString()); }
public String toString() { return "Hola mundo!"; }
public static void main(String... args)
{
new Hola().r1.run();
new Hola().r2.run();
}
}
Como se maneja el scope?
• Método estático (ClassName::methName)
• Método de un instancia (instanceRef::methName)
• Método super de un objeto particular (super::methName)
• Método de instancia de un tipo (ClassName::methName)
• Constructor de clase (ClassName::new)
• Constructor de arreglo (TypeName[]::new)
Otra forma de lambda: referencia a método
Collection<String> knownNames= Arrays.asList("Hello", "Java", "World", "8", "Streams");
Predicate<String> isKnown = knownNames::contains;
Function<String, String> upperfier = String::toUpperCase;
IntFunction<int[]> arrayMaker = int[]::new;
int[] array = arrayMaker.apply(10); // crea un arreglo int[10]
Ejemplos:
Tipos de referencias a metodos
interface Getter<O, T>
{
T get(O obj);
}
Funcionalidad emergente: Reflection Refactorizable!!
interface Setter<O, T>
{
void set(O obj, T
param);
}
public class ClaseA
{
int field1;
public int getField1()
{
return field1;
}
public void setField1(int field1)
{
this.field1= field1;
}
public static void main(String[] args)
{
Getter<ClaseA, Integer> getter= ClaseA::getField1;
Setter<ClaseA, Integer> setter=
ClaseA::setField1;
ClaseA obj= new ClaseA();
setter.set(obj, 10);
Integer value= getter.get(obj);
}
}
Funcionalidad emergente: Reflection Refactorizable!!
public class RefactoringEnabledHibernateMapper<T>
{
public RefactoringEnabledHibernateMapper(Supplier<T> supplier) {...}
public <V> void setIdAccessors(Getter<T, V> getter, Setter<T, V> setter) {...}
public <V> void addPropertyAccessors(Getter<T, V> getter, Setter<T, V> setter) {...}
}
RefactoringEnabledHibernateMapper<Person> mapper= new RefactoringEnabledHibernateMapper<Person>(Person::new);
mapper.setIdAccessors(Person::getId, Person::setId);
mapper.addPropertyAccessors(Person::getName, Person::setName);
mapper.addPropertyAccessors(Person::getAge, Person::setAge);
RefactoringEnabledHibernateMapper
Preguntas sobre expresiones lambda?
Seguimos con:
Stream API
Streams API
• Un stream es una secuencia de elementos generada a partir de:
• Collections
• Arrays
• Generators (on the fly)
• I/O Channels
• Los streams no guardan los elementos
• Mecanismo de procesamiento con pipeline de operaciones.
• En el procesamiento se aplican varias técnicas de optimización.
• Las expresiones lambda le aportan mucha legibilidad.
• Provee mecanismo versátil para recolectar los resultados.
Streams API
Pipeline de operaciones
source operation 1
operation
N
terminal operation....
collection
array
I/O channel
generated
map, filter, distinct, sorted, peek, limit, parallel,
sequencial, unordered, reduce, sum, skip
forEach, toArray,
reduce, collect,
min, max, count,
anyMatch,
allMatch,
noneMatch,
findFirst, findAny,
iterator
Streams API
Procesamiento de un stream
.map(Integer::parseInt)
.limit(3)
.forEach(i -> System.out.println(i))
.filter(i -> i % 2 != 0)
“1” “2” “3”
“1” “2” “3”
1 2 3
1 3
“4” “5”
Stream.of("1", "2", "3", "4", "5")
Streams API
Ejemplos
List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, -4);
List<Integer> distinct = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
IntStream.range(0, 100).parallel().filter(i -> i % 2 == 0).forEach(System.out::println);
List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");
String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));
List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
Predicate<String> startsWithJ = n -> n.startsWith("J");
Predicate<String> fourLetterLong = n -> n.length() == 4;
names.stream()
.filter(startsWithJ.and(fourLetterLong))
.forEach((n) -> System.out.print("Empieza con J y tiene 4 caracteres: " + n));
Streams API
Ejemplos
Map<City, Set<String>> namesByCity= people.stream().collect(
Collectors.groupingBy (
Person::getCity, Collectors.mapping (Person::getLastName, toSet())
)
);
Resultado: Obtiene los apellidos de las personas en cada ciudad
IntStream.iterate(0, i -> i + 2).limit(5).forEach(System.out::println);
Resultado: imprime 0, 2, 4, 6, 8
Streams API
Name Returns Interface Lambda signature
filter Stream<T> lazy Predicate<T> T -> boolean
map Stream<U> lazy Function<T, U> T -> U
sorted Stream<T> lazy Comparator<T> (T, T) -> int
limit Stream<T> lazy n/a n/a
skip Stream<T> lazy n/a n/a
reduce T eager BinaryOperator<T> (T, T) -> T
findFirst T eager n/a n/a
groupBy Map<U, Collection<T>> eager Function<T, U> T -> U
forEach void eager Consumer<T> T -> void
Resumen de operaciones
Preguntas sobre Stream API?
Seguimos con el:
Motor de Javascript Nashorn
Motor de Javascript Nashorn
1. Correr código dinámico Javascript nativo en la JVM
2. Se basa en el uso del nuevo bytecode InvokeDynamic, presentado
en Java 7
3. Soporta la especificación ECMAScript 5.1
4. De 2 a 10x la velocidad de Rhino
5. Se acerca mucho más a la performance de V8, según algunos
benchmarks llega a la mitad de velocidad.
a. Tener en cuenta que V8 es exclusivo para JS.
b. Nashorn recien esta naciendo.
Motor de Javascript Nashorn
Invocación desde línea de comando
$ cd /usr/bin
$ ln -s $JAVA_HOME/bin/jjs jjs
$ jjs
jjs> print('Hello World');
Archivo: hello.js
var hello = function() {
print("Hello Nashorn!");
};
hello();
$ jjs hello.js
Hello Nashorn!
Motor de Javascript Nashorn
Ejemplo de invocación
script.js:
var fun1 = function(name) {
print('Hi there from Javascript, ' + name);
return "greetings from javascript";
};
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(new FileReader("script.js"));
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("fun1", "Peter Parker");
System.out.println(result);
Motor de Javascript Nashorn
Streams
var list2 = new java.util.ArrayList();
list2.add("ddd2");
list2.add("aaa2");
list2.add("aaa3");
list2
.stream()
.filter(function(el) {
return el.startsWith("aaa");
})
.sorted()
.forEach(function(el) {
print(el);
});
Motor de Javascript Nashorn
Como extender clases de Java
var Runnable = Java.type('java.lang.Runnable');
var Printer = Java.extend(Runnable, {
run: function() {
print('printed from a separate thread');
}
});
var Thread = Java.type('java.lang.Thread');
new Thread(new Printer()).start();
new Thread(function() {
print('printed from another thread');
}).start();
Fin

Más contenido relacionado

La actualidad más candente

Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Maztherprozh
 
Uso de las clases iostream
Uso de las clases iostreamUso de las clases iostream
Uso de las clases iostream
Tensor
 
Estructura basica para c++
Estructura basica para c++Estructura basica para c++
Estructura basica para c++
claravianeybadillodelangel
 
Practica 1
Practica 1Practica 1
Practica 1
Tensor
 
Estructura básica de pascal
Estructura básica de pascalEstructura básica de pascal
Desarrollo de aplicaciones , programacion en dev ++
Desarrollo de aplicaciones , programacion  en   dev ++Desarrollo de aplicaciones , programacion  en   dev ++
Desarrollo de aplicaciones , programacion en dev ++
ernestre
 
Algoritmos y programacion en C++
Algoritmos y programacion en C++Algoritmos y programacion en C++
Algoritmos y programacion en C++
Alejandro Leon Cerna
 
Bt haskell-1
Bt haskell-1Bt haskell-1
Bt haskell-1
Rosana Alvarez
 
Santaella u5 Lenguaje C++
Santaella u5 Lenguaje C++Santaella u5 Lenguaje C++
Santaella u5 Lenguaje C++
José Ricardo Tillero Giménez
 
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEXProyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
Ivan Luis Jimenez
 
Funciones en C++
Funciones en C++Funciones en C++
Funciones en C++
ANDRES FELIPE CRUZ ERAZO
 
OPERADORES PARA C++
OPERADORES PARA C++OPERADORES PARA C++
OPERADORES PARA C++
Idalia Tristan
 
Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
Maztherprozh
 
Estructuradatospilasycolas 121106170754-phpapp02
Estructuradatospilasycolas 121106170754-phpapp02Estructuradatospilasycolas 121106170754-phpapp02
Estructuradatospilasycolas 121106170754-phpapp02
Z Karina Hernandez A
 
Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03
Germán Ferrari
 
Estructura de Programa en C++
Estructura de Programa en C++Estructura de Programa en C++
Estructura de Programa en C++
ncrmax
 

La actualidad más candente (18)

Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
 
Uso de las clases iostream
Uso de las clases iostreamUso de las clases iostream
Uso de las clases iostream
 
Estructura basica para c++
Estructura basica para c++Estructura basica para c++
Estructura basica para c++
 
Practica 1
Practica 1Practica 1
Practica 1
 
Lenguaje c ++ guía para programadores
Lenguaje c ++  guía para programadoresLenguaje c ++  guía para programadores
Lenguaje c ++ guía para programadores
 
Estructura básica de pascal
Estructura básica de pascalEstructura básica de pascal
Estructura básica de pascal
 
Desarrollo de aplicaciones , programacion en dev ++
Desarrollo de aplicaciones , programacion  en   dev ++Desarrollo de aplicaciones , programacion  en   dev ++
Desarrollo de aplicaciones , programacion en dev ++
 
Algoritmos y programacion en C++
Algoritmos y programacion en C++Algoritmos y programacion en C++
Algoritmos y programacion en C++
 
Bt haskell-1
Bt haskell-1Bt haskell-1
Bt haskell-1
 
Lex yacc
Lex yaccLex yacc
Lex yacc
 
Santaella u5 Lenguaje C++
Santaella u5 Lenguaje C++Santaella u5 Lenguaje C++
Santaella u5 Lenguaje C++
 
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEXProyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
 
Funciones en C++
Funciones en C++Funciones en C++
Funciones en C++
 
OPERADORES PARA C++
OPERADORES PARA C++OPERADORES PARA C++
OPERADORES PARA C++
 
Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
 
Estructuradatospilasycolas 121106170754-phpapp02
Estructuradatospilasycolas 121106170754-phpapp02Estructuradatospilasycolas 121106170754-phpapp02
Estructuradatospilasycolas 121106170754-phpapp02
 
Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03
 
Estructura de Programa en C++
Estructura de Programa en C++Estructura de Programa en C++
Estructura de Programa en C++
 

Destacado

55 New Features in Java SE 8
55 New Features in Java SE 855 New Features in Java SE 8
55 New Features in Java SE 8
Simon Ritter
 
Java 8
Java 8Java 8
Java 8
vilniusjug
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
David Gómez García
 
Java 8: the good parts!
Java 8: the good parts!Java 8: the good parts!
Java 8: the good parts!
Andrzej Grzesik
 
Java 8: Más funcional que nunca
Java 8: Más funcional que nuncaJava 8: Más funcional que nunca
Java 8: Más funcional que nunca
Víctor Leonel Orozco López
 
Java 8 Workshop
Java 8 WorkshopJava 8 Workshop
Java 8 Workshop
Mario Fusco
 
Functional programming with Java 8
Functional programming with Java 8Functional programming with Java 8
Functional programming with Java 8
LivePerson
 

Destacado (7)

55 New Features in Java SE 8
55 New Features in Java SE 855 New Features in Java SE 8
55 New Features in Java SE 8
 
Java 8
Java 8Java 8
Java 8
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
 
Java 8: the good parts!
Java 8: the good parts!Java 8: the good parts!
Java 8: the good parts!
 
Java 8: Más funcional que nunca
Java 8: Más funcional que nuncaJava 8: Más funcional que nunca
Java 8: Más funcional que nunca
 
Java 8 Workshop
Java 8 WorkshopJava 8 Workshop
Java 8 Workshop
 
Functional programming with Java 8
Functional programming with Java 8Functional programming with Java 8
Functional programming with Java 8
 

Similar a Java 8 - Nuevas características

Java 8 introducción a expresiones lambdas y api stream
Java 8  introducción a expresiones lambdas y api streamJava 8  introducción a expresiones lambdas y api stream
Java 8 introducción a expresiones lambdas y api stream
Eudris Cabrera
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
Eudris Cabrera
 
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Eudris Cabrera
 
Java Lambda
Java LambdaJava Lambda
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
Maztherprozh
 
Manuales ...
Manuales ...Manuales ...
Manuales ...
elidetjc
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
GalvanGR
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
DanielHidalgo92
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
miguel checa
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
denis ticona condori
 
Estructura básica de un programa en C++
Estructura básica de un programa en C++Estructura básica de un programa en C++
Estructura básica de un programa en C++
Rosbelia Balza
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
Héctor Díaz Ponce Inda
 
Django y Python para todos
Django y Python para todosDjango y Python para todos
Django y Python para todos
Miguel Angel Cumpa Ascuña
 
PRESENTACIÓN DE LA ESTRUCTURA BÁSICA PARA C++
PRESENTACIÓN DE LA ESTRUCTURA BÁSICA PARA C++PRESENTACIÓN DE LA ESTRUCTURA BÁSICA PARA C++
PRESENTACIÓN DE LA ESTRUCTURA BÁSICA PARA C++
Mena75
 
Un vistazo a java 8
Un vistazo a java 8Un vistazo a java 8
Un vistazo a java 8
Germán González
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
Víctor Bolinches
 
Estructura basica de_c_
Estructura basica de_c_Estructura basica de_c_
Estructura basica de_c_
LaishaXime
 
Estructura basica de_c_(2)
Estructura basica de_c_(2)Estructura basica de_c_(2)
Estructura basica de_c_(2)
gadiel1515
 

Similar a Java 8 - Nuevas características (20)

Java 8 introducción a expresiones lambdas y api stream
Java 8  introducción a expresiones lambdas y api streamJava 8  introducción a expresiones lambdas y api stream
Java 8 introducción a expresiones lambdas y api stream
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
 
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
 
Java Lambda
Java LambdaJava Lambda
Java Lambda
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
 
Manuales ...
Manuales ...Manuales ...
Manuales ...
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
 
Estructura básica de un programa en C++
Estructura básica de un programa en C++Estructura básica de un programa en C++
Estructura básica de un programa en C++
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Django y Python para todos
Django y Python para todosDjango y Python para todos
Django y Python para todos
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
PRESENTACIÓN DE LA ESTRUCTURA BÁSICA PARA C++
PRESENTACIÓN DE LA ESTRUCTURA BÁSICA PARA C++PRESENTACIÓN DE LA ESTRUCTURA BÁSICA PARA C++
PRESENTACIÓN DE LA ESTRUCTURA BÁSICA PARA C++
 
Un vistazo a java 8
Un vistazo a java 8Un vistazo a java 8
Un vistazo a java 8
 
Framework .NET 3.5 10 Linq
Framework .NET 3.5 10 LinqFramework .NET 3.5 10 Linq
Framework .NET 3.5 10 Linq
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Estructura basica de_c_
Estructura basica de_c_Estructura basica de_c_
Estructura basica de_c_
 
Estructura basica de_c_(2)
Estructura basica de_c_(2)Estructura basica de_c_(2)
Estructura basica de_c_(2)
 

Último

ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
DanielErazoMedina
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
cofferub
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Telefónica
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
jjfch3110
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
IsabellaRubio6
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
cdraco
 
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdfDesarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
AlejandraCasallas7
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
vazquezgarciajesusma
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
marianabz2403
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
cristianrb0324
 
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
Leidyfuentes19
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
zoecaicedosalazar
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
DiegoCampos433849
 
Alan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentaciónAlan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentación
JuanPrez962115
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
Luis Enrique Zafra Haro
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
cj3806354
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
AlejandraCasallas7
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
Fernando Villares
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
thomasdcroz38
 

Último (20)

ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdfDesarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
 
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
 
Alan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentaciónAlan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentación
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 

Java 8 - Nuevas características

  • 4. Functional Interface: 1. Es una Interface que tiene un solo método abstracto. 2. El annotation @FunctionalInterface se puede usar como mecanismo de advertencia en la compilación. 3. Se suelen implementar métodos por defecto dentro. 4. Antes de crear una nueva mirar las predefinidas en java.util.function.* 5. Los tipos de datos primitivos tienen interfaces funcionales predefinidas específicas. 6. Son usadas en conjunto con expresiones lambdas
  • 5. public interface ActionListener extends EventListener { public void actionPerformed(ActionEvent e); } public interface Callable<V> { public V call(); } public interface Runnable { public void run(); } public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); } Ejemplos de Functional Interfaces ya conocidas
  • 6. • Supplier<T>: Devuelve un T • Consumer<T>: Recibe un T • BiConsumer<T, U>: Recibe un T y un U • Predicate<T>: Evalua un T y devuelve un boolean • Function<T, R>: Recive un T y devuelve un R • BinaryOperator<T>: Recibe 2 T y devuelve un T Functional Interfaces Predefinidas genéricas • (Int | Long | Double)Supplier • (Int | Long | Double)Consumer • (Int | Long | Double)Predicate • (Int | Long | Double)Function<R> • (Int | Long | Double)BinaryOperator • Obj(Int | Long | Double)Consumer<T> • (Int | Long | Double)To(Int | Long | Double)Function Predefinidas para primitivos
  • 7. Functional Interfaces Default Methods 1.Permiten definir Interfaces que tengan algo de comportamiento. 2.Son heredados por las clases implementadoras 3.Al heredar más de una implementación del mismo método se puede elegir cual usar en la subclase. 4.Facilitan “backward compatibility” de Collections 5.Solo interactúan con otros métodos y son “stateless”.
  • 8. Ejemplo de default methods public interface Predicate<T> { boolean test(T t); default Predicate<T> and(Predicate<? super T> other) { return (t) -> test(t) && other.test(t); } default Predicate<T> negate() { return (t) -> !test(t); } ... }
  • 9. Default Methods Herencia public interface A { default public String foo() { return “A”; } } public interface B { default public String foo() { return “B”; } } public class AB implements A, B { public String foo() { return B.super.foo(); } }
  • 12. Expresiones Lambda • Es un bloque de código • Método anónimo • Parecido al resultado obtenido con clases anónimas • Termina creando una instancia de una interfaz funcional Que es una expresión lambda?
  • 13. Expresiones Lambda • Código más compacto y limpio • Da lugar al surgimiento de Streams API • + declarativo, - implementativo • Permite aplicar varias optimizaciones • Inferencia de tipos • Mismas reglas de scope que los bloques de código tradicionales • Primer paso para la inclusión de programación funcional Ventajas
  • 14. Expresiones Lambda • No son funciones reales, son métodos anónimos. • Sólo permite capturar variables inmutables y miembros de la clase. • No se puede declarar la firma de una “funcion” anónima: public static void runOperation((int -> int) operation) { ... } Contras
  • 15. Forma básica: arg -> body Forma extendida: ( T1 arg1, T2 arg2 ) -> { body } Como es una expresión lambda?
  • 16. new InterfaceA() { public T2 method1(T1 v1) { return result; } }; v1 -> result Misma definición, diferentes expresiones
  • 17. button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println(“click”); } }); El ejemplo más esperado.. JButton! Con clases anónimas button.addActionListener(e -> System.out.println(“click”)); Con lambdas
  • 18. ; BinaryOperator<Integer> sumador= new BinaryOperator<Integer>() { public Integer apply(Integer v1, Integer v2) { return v1 + v2; } }; Inferencia de tipos, bloque de código, return (Integer v1, Integer v2) -> { return v1 + v2; } ó (v1, v2) -> { return v1 + v2; } ó (v1, v2) -> v1 + v2 BinaryOperator<Integer> sumador=
  • 19. Interfaces funcionales // Asignacion Predicate<String> p = String::isEmpty; // Predicate creado en contexto de la invocacion stream.filter(e -> e.getSize() > 10)... // En casteo stream.map((ToIntFunction) e -> e.getSize())... // Comparator creado con lambda String[] list= new String[] { "One", "Two", "Three", "Four", "Five", "Six" }; Arrays.sort(list, (a, b)->a.substring(1).compareTo(b.substring(1))); Creadas a partir de lambdas
  • 20. • Declaración de variables • Asignaciones • Instrucción “return” • Inicializadores de Arrays • Parámetros de métodos o constructores • Cuerpo de un lambda • Condicionales (?:) • Casteos Donde se pueden usar lambdas? FileFilter[] filters= new FileFilter[] { f -> f.exists(), f -> f.getName().startsWith("q") }; Object o = (Runnable) () -> { System.out.println("hola"); }; Supplier<Runnable> c = () -> () -> { System.out.println("hola"); }; Callable<Integer> c = flag ? (() -> 23) : (() -> 42); Ejemplos para destacar: En contextos que tengan “target type”:
  • 21. public class Hola { Runnable r1 = () -> { System.out.println(this); } Runnable r2 = () -> { System.out.println(toString()); } public String toString() { return "Hola mundo!"; } public static void main(String... args) { new Hola().r1.run(); new Hola().r2.run(); } } Como se maneja el scope?
  • 22. • Método estático (ClassName::methName) • Método de un instancia (instanceRef::methName) • Método super de un objeto particular (super::methName) • Método de instancia de un tipo (ClassName::methName) • Constructor de clase (ClassName::new) • Constructor de arreglo (TypeName[]::new) Otra forma de lambda: referencia a método Collection<String> knownNames= Arrays.asList("Hello", "Java", "World", "8", "Streams"); Predicate<String> isKnown = knownNames::contains; Function<String, String> upperfier = String::toUpperCase; IntFunction<int[]> arrayMaker = int[]::new; int[] array = arrayMaker.apply(10); // crea un arreglo int[10] Ejemplos: Tipos de referencias a metodos
  • 23. interface Getter<O, T> { T get(O obj); } Funcionalidad emergente: Reflection Refactorizable!! interface Setter<O, T> { void set(O obj, T param); } public class ClaseA { int field1; public int getField1() { return field1; } public void setField1(int field1) { this.field1= field1; } public static void main(String[] args) { Getter<ClaseA, Integer> getter= ClaseA::getField1; Setter<ClaseA, Integer> setter= ClaseA::setField1; ClaseA obj= new ClaseA(); setter.set(obj, 10); Integer value= getter.get(obj); } }
  • 24. Funcionalidad emergente: Reflection Refactorizable!! public class RefactoringEnabledHibernateMapper<T> { public RefactoringEnabledHibernateMapper(Supplier<T> supplier) {...} public <V> void setIdAccessors(Getter<T, V> getter, Setter<T, V> setter) {...} public <V> void addPropertyAccessors(Getter<T, V> getter, Setter<T, V> setter) {...} } RefactoringEnabledHibernateMapper<Person> mapper= new RefactoringEnabledHibernateMapper<Person>(Person::new); mapper.setIdAccessors(Person::getId, Person::setId); mapper.addPropertyAccessors(Person::getName, Person::setName); mapper.addPropertyAccessors(Person::getAge, Person::setAge); RefactoringEnabledHibernateMapper
  • 27. Streams API • Un stream es una secuencia de elementos generada a partir de: • Collections • Arrays • Generators (on the fly) • I/O Channels • Los streams no guardan los elementos • Mecanismo de procesamiento con pipeline de operaciones. • En el procesamiento se aplican varias técnicas de optimización. • Las expresiones lambda le aportan mucha legibilidad. • Provee mecanismo versátil para recolectar los resultados.
  • 28. Streams API Pipeline de operaciones source operation 1 operation N terminal operation.... collection array I/O channel generated map, filter, distinct, sorted, peek, limit, parallel, sequencial, unordered, reduce, sum, skip forEach, toArray, reduce, collect, min, max, count, anyMatch, allMatch, noneMatch, findFirst, findAny, iterator
  • 29. Streams API Procesamiento de un stream .map(Integer::parseInt) .limit(3) .forEach(i -> System.out.println(i)) .filter(i -> i % 2 != 0) “1” “2” “3” “1” “2” “3” 1 2 3 1 3 “4” “5” Stream.of("1", "2", "3", "4", "5")
  • 30. Streams API Ejemplos List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, -4); List<Integer> distinct = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList()); IntStream.range(0, 100).parallel().filter(i -> i % 2 == 0).forEach(System.out::println); List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada"); String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", ")); List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp"); Predicate<String> startsWithJ = n -> n.startsWith("J"); Predicate<String> fourLetterLong = n -> n.length() == 4; names.stream() .filter(startsWithJ.and(fourLetterLong)) .forEach((n) -> System.out.print("Empieza con J y tiene 4 caracteres: " + n));
  • 31. Streams API Ejemplos Map<City, Set<String>> namesByCity= people.stream().collect( Collectors.groupingBy ( Person::getCity, Collectors.mapping (Person::getLastName, toSet()) ) ); Resultado: Obtiene los apellidos de las personas en cada ciudad IntStream.iterate(0, i -> i + 2).limit(5).forEach(System.out::println); Resultado: imprime 0, 2, 4, 6, 8
  • 32. Streams API Name Returns Interface Lambda signature filter Stream<T> lazy Predicate<T> T -> boolean map Stream<U> lazy Function<T, U> T -> U sorted Stream<T> lazy Comparator<T> (T, T) -> int limit Stream<T> lazy n/a n/a skip Stream<T> lazy n/a n/a reduce T eager BinaryOperator<T> (T, T) -> T findFirst T eager n/a n/a groupBy Map<U, Collection<T>> eager Function<T, U> T -> U forEach void eager Consumer<T> T -> void Resumen de operaciones
  • 34. Seguimos con el: Motor de Javascript Nashorn
  • 35. Motor de Javascript Nashorn 1. Correr código dinámico Javascript nativo en la JVM 2. Se basa en el uso del nuevo bytecode InvokeDynamic, presentado en Java 7 3. Soporta la especificación ECMAScript 5.1 4. De 2 a 10x la velocidad de Rhino 5. Se acerca mucho más a la performance de V8, según algunos benchmarks llega a la mitad de velocidad. a. Tener en cuenta que V8 es exclusivo para JS. b. Nashorn recien esta naciendo.
  • 36. Motor de Javascript Nashorn Invocación desde línea de comando $ cd /usr/bin $ ln -s $JAVA_HOME/bin/jjs jjs $ jjs jjs> print('Hello World'); Archivo: hello.js var hello = function() { print("Hello Nashorn!"); }; hello(); $ jjs hello.js Hello Nashorn!
  • 37. Motor de Javascript Nashorn Ejemplo de invocación script.js: var fun1 = function(name) { print('Hi there from Javascript, ' + name); return "greetings from javascript"; }; ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval(new FileReader("script.js")); Invocable invocable = (Invocable) engine; Object result = invocable.invokeFunction("fun1", "Peter Parker"); System.out.println(result);
  • 38. Motor de Javascript Nashorn Streams var list2 = new java.util.ArrayList(); list2.add("ddd2"); list2.add("aaa2"); list2.add("aaa3"); list2 .stream() .filter(function(el) { return el.startsWith("aaa"); }) .sorted() .forEach(function(el) { print(el); });
  • 39. Motor de Javascript Nashorn Como extender clases de Java var Runnable = Java.type('java.lang.Runnable'); var Printer = Java.extend(Runnable, { run: function() { print('printed from a separate thread'); } }); var Thread = Java.type('java.lang.Thread'); new Thread(new Printer()).start(); new Thread(function() { print('printed from another thread'); }).start();
  • 40. Fin