From db3d1b9e2eda6fd8c2ff7effe756f595d3fb16f9 Mon Sep 17 00:00:00 2001 From: Geovanny Mendoza Date: Tue, 26 Nov 2024 00:18:25 -0500 Subject: [PATCH 1/5] V[0.0.1] Add translation of the index and introduction pages. --- src/docs/asciidoc/es/getting_started_es.adoc | 86 ++++ src/docs/asciidoc/es/images/binarytree1.png | Bin 0 -> 6738 bytes src/docs/asciidoc/es/images/binarytree2.png | Bin 0 -> 10237 bytes .../asciidoc/es/images/collections-seq.png | Bin 0 -> 12474 bytes .../es/images/collections-set-map.png | Bin 0 -> 13335 bytes src/docs/asciidoc/es/images/list1.png | Bin 0 -> 2815 bytes src/docs/asciidoc/es/images/list2.png | Bin 0 -> 3525 bytes src/docs/asciidoc/es/images/queue1.png | Bin 0 -> 4955 bytes src/docs/asciidoc/es/images/queue2.png | Bin 0 -> 3191 bytes .../asciidoc/es/images/vavr-collections.png | Bin 0 -> 14746 bytes src/docs/asciidoc/es/images/vavr-overview.png | Bin 0 -> 77665 bytes src/docs/asciidoc/es/index_es.adoc | 21 + src/docs/asciidoc/es/introduction_es.adoc | 392 ++++++++++++++++ src/docs/asciidoc/es/usage_guide_es.adoc | 440 ++++++++++++++++++ 14 files changed, 939 insertions(+) create mode 100644 src/docs/asciidoc/es/getting_started_es.adoc create mode 100644 src/docs/asciidoc/es/images/binarytree1.png create mode 100644 src/docs/asciidoc/es/images/binarytree2.png create mode 100644 src/docs/asciidoc/es/images/collections-seq.png create mode 100644 src/docs/asciidoc/es/images/collections-set-map.png create mode 100644 src/docs/asciidoc/es/images/list1.png create mode 100644 src/docs/asciidoc/es/images/list2.png create mode 100644 src/docs/asciidoc/es/images/queue1.png create mode 100644 src/docs/asciidoc/es/images/queue2.png create mode 100644 src/docs/asciidoc/es/images/vavr-collections.png create mode 100644 src/docs/asciidoc/es/images/vavr-overview.png create mode 100644 src/docs/asciidoc/es/index_es.adoc create mode 100644 src/docs/asciidoc/es/introduction_es.adoc create mode 100644 src/docs/asciidoc/es/usage_guide_es.adoc diff --git a/src/docs/asciidoc/es/getting_started_es.adoc b/src/docs/asciidoc/es/getting_started_es.adoc new file mode 100644 index 0000000..4271889 --- /dev/null +++ b/src/docs/asciidoc/es/getting_started_es.adoc @@ -0,0 +1,86 @@ +== Comenzando + +Los proyectos que incluyan Vavr deben apuntar como mínimo a Java 1.8. + +El archivo `.jar` está disponible en http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22io.vavr%22%20a%3A%22vavr%22[Maven Central]. + +=== Gradle + +[source,groovy] +[subs="attributes"] +---- +dependencies { + compile "io.vavr:vavr:{project-version}" +} +---- + +Gradle 7+ + +[source,groovy] +[subs="attributes"] +---- +dependencies { + implementation "io.vavr:vavr:{project-version}" +} +---- + +=== Maven + +[source,xml] +---- + + + io.vavr + vavr + 0.10.4 + + +---- + +=== Independiente + +Debido a que Vavr __no__ depende de ninguna biblioteca (aparte de la JVM), puedes agregarlo fácilmente como un archivo `.jar` independiente a tu __classpath__. + +=== Snapshots + +Las versiones en desarrollo se pueden encontrar https://oss.sonatype.org/content/repositories/snapshots/io/vavr/vavr[aquí]. + +==== Gradle + +Agrega el repositorio adicional de snapshots en tu archivo `build.gradle`: + +[source,groovy] +---- +repositories { + (...) + maven { url "https://oss.sonatype.org/content/repositories/snapshots" } +} +---- + +==== Maven + +Asegúrate de que tu archivo ``~/.m2/settings.xml`` contenga lo siguiente: + +[source,xml] +---- + + + allow-snapshots + + true + + + + snapshots-repo + https://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + + +---- diff --git a/src/docs/asciidoc/es/images/binarytree1.png b/src/docs/asciidoc/es/images/binarytree1.png new file mode 100644 index 0000000000000000000000000000000000000000..db8aa9e083928abef5f1a59c60a238013070b072 GIT binary patch literal 6738 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 literal 0 HcmV?d00001 diff --git a/src/docs/asciidoc/es/images/binarytree2.png b/src/docs/asciidoc/es/images/binarytree2.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0e0ccb2170a9fe9e87e035e49f5aab32ca4a23 GIT binary patch literal 10237 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 DcC%>S literal 0 HcmV?d00001 diff --git a/src/docs/asciidoc/es/images/collections-seq.png b/src/docs/asciidoc/es/images/collections-seq.png new file mode 100644 index 0000000000000000000000000000000000000000..285696b11153327cc7477406c646c5c460f6c4ba GIT binary patch literal 12474 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 literal 0 HcmV?d00001 diff --git a/src/docs/asciidoc/es/images/queue1.png b/src/docs/asciidoc/es/images/queue1.png new file mode 100644 index 0000000000000000000000000000000000000000..75c350a7aa173309672db564e49860d6ed414829 GIT binary patch literal 4955 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 Z{|DwJN3eONPq+X8002ovPDHLkV1hY$?Lq(m literal 0 HcmV?d00001 diff --git a/src/docs/asciidoc/es/images/queue2.png b/src/docs/asciidoc/es/images/queue2.png new file mode 100644 index 0000000000000000000000000000000000000000..63e4d663c0e64eaacfa9b054d20ab0f6a6763ac8 GIT binary patch literal 3191 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 literal 0 HcmV?d00001 diff --git a/src/docs/asciidoc/es/images/vavr-collections.png b/src/docs/asciidoc/es/images/vavr-collections.png new file mode 100644 index 0000000000000000000000000000000000000000..38ae50b612be7be2b1803975d2e7f9c6de26c86f GIT binary patch literal 14746 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 literal 0 HcmV?d00001 diff --git a/src/docs/asciidoc/es/images/vavr-overview.png b/src/docs/asciidoc/es/images/vavr-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5b299a9c98f396d6732d4bd53625e5f714536a35 GIT binary patch literal 77665 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%0D6YBEPc&4((Tx_^*4;mM0Cr>n?PNjeg_pS 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 divide(Integer dividend, Integer divisor) { + return Try.of(() -> dividend / divisor); +} + +---- + +Esta versión de `divide` ya no lanza ninguna excepción. Hicimos que el posible fallo sea explícito al usar el tipo `Try` + +==== Transparencia Referencial + +Una función, o más generalmente una expresión, se denomina https://en.wikipedia.org/wiki/Referential_transparency[referencialmente transparente] si una llamada puede ser reemplazada por su valor sin afectar el comportamiento del programa. Dicho de manera sencilla, dado el mismo input, la salida siempre será la misma. + +[source,java] +---- +// no es referencialmente transparente +Math.random(); + +// referencialmente transparente +Math.max(1, 2); + +---- + +Una función se llama https://en.wikipedia.org/wiki/Pure_function[pura] si todas las expresiones involucradas son referencialmente transparentes. Una aplicación compuesta por funciones puras probablemente simplemente funcione si compila. Podemos razonar sobre ella. Las pruebas unitarias son fáciles de escribir y la depuración se convierte en un vestigio del pasado. + +==== Pensar en Valores + +Rich Hickey, el creador de Clojure, dio una charla excepcional sobre https://www.youtube.com/watch?v=-6BsiVyC1kM[El Valor de los Valores]. Los valores más interesantes son los valores https://en.wikipedia.org/wiki/Immutable_object[immutable]. La razón principal es que los valores inmutables: + +* Son intrínsecamente seguros para hilos y, por lo tanto, no necesitan sincronización. +* Son estables en relación con __equals__ and __hashCode__, lo que los convierte en claves de hash confiables. +* No necesitan ser clonados. +* Se comportan de manera segura con tipos al usarse en conversiones covariantes no verificadas (específicas de Java). + +La clave para mejorar Java es usar __valores inmutables__ junto con __funciones referencialmente transparentes__. + +Vavr proporciona los http://static.javadoc.io/io.vavr/vavr/0.10.4/io/vavr/control/package-summary.html[controles] y las https://static.javadoc.io/io.vavr/vavr/0.10.4/io/vavr/collection/package-summary.html[colecciones] necesarios para lograr este objetivo en la programación cotidiana en Java. + +=== Estructuras de Datos en Resumen + +La biblioteca de colecciones de Vavr incluye un conjunto rico de estructuras de datos funcionales construidas sobre lambdas. La única interfaz que comparten con las colecciones originales de Java es `Iterable`. La razón principal es que los métodos mutadores de las interfaces de colecciones de Java no devuelven un objeto del tipo de colección subyacente. + +Veremos por qué esto es esencial observando los diferentes tipos de estructuras de datos. + +==== Estructuras de Datos Mutables + +Java es un lenguaje de programación orientado a objetos. Encapsulamos el estado en objetos para lograr ocultar los datos y proporcionamos métodos mutadores para controlar dicho estado. El https://en.wikipedia.org/wiki/Java_collections_framework[framework de colecciones de Java (JCF)] se basa en esta idea. + +[source,java] +---- +interface Collection { + // elimina todos los elementos de esta colección + void clear(); +} + +---- + +Hoy en día, considero que un tipo de retorno __void__ es un indicio de mal diseño. Es evidencia de que ocurren https://en.wikipedia.org/wiki/Side_effect_(computer_science)[efectos secundarios] y de que el estado se está mutando. El estado mutable __Shared__ es una fuente importante de fallos, no solo en un entorno concurrente. + +==== Estructuras de Datos Inmutables + +Las estructuras de datos https://en.wikipedia.org/wiki/Immutable_object[Immutables] no pueden modificarse después de su creación. En el contexto de Java, se utilizan ampliamente en forma de wrappers de colecciones. + +[source,java] +---- +List list = Collections.unmodifiableList(otherList); + +// Boom! +list.add("Por qué no?"); + +---- + +Existen varias bibliotecas que nos proporcionan métodos de utilidad similares. El resultado siempre es una vista no modificable de la colección específica. Por lo general, lanzará una excepción en tiempo de ejecución si llamamos a un método mutador. + +==== Estructuras de Datos Persistentes + +Una https://en.wikipedia.org/wiki/Persistent_data_structure[estructura de datos persistente] conserva la versión anterior de sí misma cuando se modifica, y por lo tanto es efectivamente inmutable. Las estructuras de datos completamente persistentes permiten tanto actualizaciones como consultas en cualquier versión. + +Muchas operaciones realizan solo pequeños cambios. Simplemente copiar la versión anterior no sería eficiente. Para ahorrar tiempo y memoria, es crucial identificar las similitudes entre dos versiones y compartir la mayor cantidad de datos posible. + +Este modelo no impone ningún detalle de implementación específico. Aquí es donde entran en juego las estructuras de datos funcionales. + +=== Estructuras de Datos Funcionales + +También conocidas como https://en.wikipedia.org/wiki/Purely_functional[estructuras de datos __puramente__ funcionales], son __inmutables__ y __persistentes__. Los métodos de las estructuras de datos funcionales son __referencialmente transparentes__. + +Vavr incluye una amplia gama de las estructuras de datos funcionales más utilizadas. Los siguientes ejemplos se explican en detalle. + +==== Linked List + +Una de las estructuras de datos funcionales más populares y también más simples es la lista enlazada https://en.wikipedia.org/wiki/Linked_list[(singly) linked List]. Esta estructura tiene un elemento principal __head__ y una lista __tail__ (cola). Una lista enlazada se comporta como una pila (Stack) que sigue el método https://en.wikipedia.org/wiki/Stack_(abstract_data_type)[último en entrar, primero en salir (LIFO)]. + +En http://vavr.io/[Vavr], podemos instanciar una lista de la siguiente manera: + +[source,java] +---- +// = List(1, 2, 3) +List list1 = List.of(1, 2, 3); +---- + +Cada elemento de la lista forma un nodo separado de la lista. La cola (__tail__) del último elemento es `Nil`, que representa la lista vacía. + +image::images/list1.png?w=660[Lista 1] + +Esto nos permite compartir elementos entre diferentes versiones de la lista. + +[source,java] +---- +// = List(0, 2, 3) +List list2 = list1.tail().prepend(0); +---- + +El nuevo elemento principal `0` está __vinculado__ a la cola de la lista original. La lista original permanece sin modificar. + +image::images/list2.png?w=660[Lista 2] + +Estas operaciones se realizan en tiempo constante, es decir, son independientes del tamaño de la lista. La mayoría de las otras operaciones toman tiempo lineal. En Vavr, esto se expresa mediante la interfaz `LinearSeq`, que ya conocemos de Scala. + +Si necesitamos estructuras de datos que permitan consultas en tiempo constante, Vavr ofrece `Array` y `Vector`. Ambos tienen capacidades de https://en.wikipedia.org/wiki/Random_access[acceso aleatorio]. + +El tipo `Array` está respaldado por un array de objetos de Java. Las operaciones de inserción y eliminación toman tiempo lineal. Él `Vector` está entre `Array` y `List`. Tiene un buen rendimiento tanto en acceso aleatorio como en modificaciones. + +De hecho, la lista enlazada también puede utilizarse para implementar una estructura de datos tipo cola (__Queue__). + +==== Queue + +Una cola funcional muy eficiente puede implementarse utilizando dos listas enlazadas. La lista __front__ contiene los elementos que se eliminan de la __cola__, mientras que la lista __rear__ contiene los elementos que se agregan. Ambas operaciones, `enqueue` y `dequeue`, se realizan en tiempo O(1). + +[source,java] +---- +Queue queue = Queue.of(1, 2, 3) + .enqueue(4) + .enqueue(5); +---- + +La cola inicial se crea con tres elementos. Luego, se agregan dos elementos en la lista rear. + +image::images/queue1.png?w=660[Queue 1] + +Si la lista front se queda sin elementos al hacer `dequeue`, la lista __rear__ se invierte y se convierte en la nueva lista __front__. + +image::images/queue2.png?w=660[Queue 2] + +Al hacer `dequeue` de un elemento, obtenemos un par que incluye el primer elemento y la cola restante. Es necesario devolver la nueva versión de la cola porque las estructuras de datos funcionales son inmutables y persistentes. La cola original no se ve afectada. + +[source,java] +---- +Queue queue = Queue.of(1, 2, 3); + +// = (1, Queue(2, 3)) +Tuple2> dequeued = + queue.dequeue(); +---- + +¿Qué sucede cuando la cola está vacía? En ese caso, `dequeue()` lanzará una excepción `NoSuchElementException`. Para hacerlo de __manera funcional__, esperaríamos más bien un resultado opcional. + +[source,java] +---- +// = Some((1, Queue())) +Queue.of(1).dequeueOption(); + +// = None +Queue.empty().dequeueOption(); +---- + +Un resultado opcional puede procesarse aún más, ya sea que esté vacío o no. + +[source,java] +---- +// = Queue(1) +Queue queue = Queue.of(1); + +// = Some((1, Queue())) +Option>> dequeued = + queue.dequeueOption(); + +// = Some(1) +Option element = dequeued.map(Tuple2::_1); + +// = Some(Queue()) +Option> remaining = + dequeued.map(Tuple2::_2); +---- + +==== Conjuntos Ordenados (__Sorted Set__) + +Los conjuntos ordenados son estructuras de datos que se utilizan con más frecuencia que las colas. Utilizamos árboles binarios de búsqueda para modelarlos de manera funcional. Estos árboles están compuestos por nodos que pueden tener hasta dos hijos y valores en cada nodo. + +Construimos árboles binarios de búsqueda bajo la presencia de un orden, representado por un `Comparator`. Todos los valores del subárbol izquierdo de cualquier nodo dado son estrictamente menores que el valor del nodo. Todos los valores del subárbol derecho son estrictamente mayores. + +[source,java] +---- +// = TreeSet(1, 2, 3, 4, 6, 7, 8) +SortedSet xs = TreeSet.of(6, 1, 3, 2, 4, 7, 8); +---- + +image::images/binarytree1.png?w=660[Árbol Binario 1] + +Las búsquedas en este tipo de árboles se realizan en tiempo O(log n). Comenzamos la búsqueda en la raíz y determinamos si encontramos el elemento. Debido al orden total de los valores, sabemos hacia dónde buscar a continuación, en la rama izquierda o derecha del árbol actual. + +[source,java] +---- +// = TreeSet(1, 2, 3); +SortedSet set = TreeSet.of(2, 3, 1, 2); + +// = TreeSet(3, 2, 1); +Comparator c = (a, b) -> b - a; +SortedSet reversed = TreeSet.of(c, 2, 3, 1, 2); +---- + +La mayoría de las operaciones sobre árboles son intrínsecamente https://en.wikipedia.org/wiki/Recursion[recursivas]. La función de inserción se comporta de manera similar a la función de búsqueda. Cuando se alcanza el final de un camino de búsqueda, se crea un nuevo nodo y se reconstruye todo el camino hasta la raíz. Siempre que sea posible, los nodos hijos existentes se reutilizan. Por lo tanto, la operación de inserción toma tiempo y espacio O(log n). + +[source,java] +---- +// = TreeSet(1, 2, 3, 4, 5, 6, 7, 8) +SortedSet ys = xs.add(5); +---- + +image::images/binarytree2.png?w=660[Árbol Binario 2] + +Para mantener las características de rendimiento de un árbol binario de búsqueda, debe mantenerse equilibrado. Todos los caminos desde la raíz hasta una hoja deben tener aproximadamente la misma longitud. + +En Vavr, implementamos un árbol binario de búsqueda basado en un https://en.wikipedia.org/wiki/Red%E2%80%93black_tree[Red/Black Tree] (__Árbol Rojo/Negro__). Este utiliza una estrategia de coloración específica para mantener el equilibrio del árbol durante las operaciones de inserción y eliminación. Para obtener más información sobre este tema, se recomienda leer el libro http://www.amazon.com/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504[Purely Functional Data Structures] de Chris Okasaki. + +=== Estado de las Colecciones + +En general, estamos observando una convergencia entre los lenguajes de programación. Las características buenas prevalecen, mientras que otras desaparecen. Sin embargo, Java es diferente: está destinado a ser compatible hacia atrás para siempre. Esa es una fortaleza, pero también ralentiza su evolución. + +Las expresiones lambda acercaron a Java y Scala, pero aún son muy diferentes. Martin Odersky, el creador de Scala, mencionó recientemente en su charla magistral en la https://www.youtube.com/watch?v=NW5h8d_ZyOs[BDSBTB 2015] el estado de las colecciones en Java 8. + +Describió el `Stream` de Java como una forma elegante de un iterador. La API de `Stream` de Java 8 es un ejemplo de una colección __elevada__. Lo que hace es __definir__ una computación y __vincularla__ a una colección específica en otro paso explícito. + +[source,java] +---- +// i + 1 +i.prepareForAddition() + .add(1) + .mapBackToInteger(Mappers.toInteger()) +---- + +Así es como funciona la nueva API de `Stream` en Java 8. Es una capa computacional encima de las conocidas colecciones de Java. + +[source,java] +---- +// = ["1", "2", "3"] en Java 8 +Arrays.asList(1, 2, 3) + .stream() + .map(Object::toString) + .collect(Collectors.toList()) +---- + +Vavr se inspira enormemente en Scala. Así es como debería verse el ejemplo anterior en Java 8. + +[source,java] +---- +// = Stream("1", "2", "3") en Vavr +Stream.of(1, 2, 3).map(Object::toString) +---- + +En el último año, hemos dedicado mucho esfuerzo a implementar la biblioteca de colecciones de Vavr. Comprende los tipos de colecciones más ampliamente utilizados. + +==== Seq + +Comenzamos nuestro viaje implementando tipos secuenciales. Ya describimos la lista enlazada anteriormente. Luego siguió el __Stream__, una lista enlazada perezosa (__lazy__) que nos permite procesar secuencias de elementos posiblemente infinitas. + +image::images/collections-seq.png?w=660[Seq] + +Todas las colecciones son `Iterable` y, por lo tanto, pueden usarse en bucles `for` mejorados. + +[source,java] +---- +for (String s : List.of("Java", "Advent")) { + // efectos secundarios y mutación +} +---- + +Podemos lograr lo mismo internalizando el bucle e inyectando el comportamiento usando una lambda. + +[source,java] +---- +List.of("Java", "Advent").forEach(s -> { + // efectos secundarios y mutación +}); +---- + +De todos modos, como vimos anteriormente, preferimos expresiones que devuelvan un valor sobre instrucciones que no devuelven nada. Observando un ejemplo simple, pronto reconoceremos que las instrucciones añaden ruido y separan lo que pertenece junto. + +[source,java] +---- +String join(String... words) { + StringBuilder builder = new StringBuilder(); + for(String s : words) { + if (builder.length() > 0) { + builder.append(", "); + } + builder.append(s); + } + return builder.toString(); +} +---- + +Las colecciones de Vavr nos proporcionan muchas funciones para operar sobre los elementos subyacentes. Esto nos permite expresar las cosas de manera muy concisa. + +[source,java] +---- +String join(String... words) { + return List.of(words) + .intersperse(", ") + .foldLeft(new StringBuilder(), StringBuilder::append) + .toString(); +} +---- + +La mayoría de los objetivos se pueden lograr de diversas maneras usando Vavr. Aquí reducimos todo el cuerpo del método a llamadas de función fluidas en una instancia de List. Incluso podríamos eliminar todo el método y usar directamente nuestra lista para obtener el resultado de la computación. + +[source,java] +---- +List.of(words).mkString(", "); +---- + +En una aplicación del mundo real, ahora podemos reducir drásticamente el número de líneas de código y, por lo tanto, disminuir el riesgo de errores. + +==== Set y Map + +Las secuencias son geniales. Pero, para ser completos, una biblioteca de colecciones también necesita diferentes tipos de `Set` y `Map`. + +image::images/collections-set-map.png?w=660[Set y Map] + +Describimos cómo modelar conjuntos ordenados con estructuras de árboles binarios. Un `Map` ordenado no es más que un `Set` ordenado que contiene pares clave-valor y que tiene un orden para las claves. + +La implementación de `HashMap` se respalda mediante un http://lampwww.epfl.ch/papers/idealhashtrees.pdf[Hash Array Mapped Trie (HAMT)]. En consecuencia, el `HashSet` está respaldado por un HAMT que contiene pares clave-clave. + +Nuestro `Map` no tiene un tipo especial de `Entry` para representar pares clave-valor. En su lugar, usamos `Tuple2`, que ya es parte de Vavr. Los campos de un `Tuple` están enumerados. + +[source,java] +---- +// = (1, "A") +Tuple2 entry = Tuple.of(1, "A"); + +Integer key = entry._1; +String value = entry._2; +---- + +Los Map y Tuple se utilizan ampliamente en Vavr. Los Tuple son esenciales para manejar tipos de retorno con múltiples valores de forma general. + +[source,java] +---- +// = HashMap((0, List(2, 4)), (1, List(1, 3))) +List.of(1, 2, 3, 4).groupBy(i -> i % 2); + +// = List((a, 0), (b, 1), (c, 2)) +List.of('a', 'b', 'c').zipWithIndex(); +---- + +En Vavr, exploramos y probamos nuestra biblioteca implementando los https://projecteuler.net/archives[99 problemas de Euler]. Es una excelente prueba de concepto. No dudes en enviar solicitudes de __pull__. diff --git a/src/docs/asciidoc/es/usage_guide_es.adoc b/src/docs/asciidoc/es/usage_guide_es.adoc new file mode 100644 index 0000000..fd9e9df --- /dev/null +++ b/src/docs/asciidoc/es/usage_guide_es.adoc @@ -0,0 +1,440 @@ +== Usage Guide + +Vavr comes along with well-designed representations of some of the most basic types which apparently are missing or rudimentary in Java: `Tuple`, `Value` and `λ`. +In Vavr, everything is built upon these three basic building blocks: + +image::images/vavr-overview.png[Vavr Overview] + +=== Tuples + +Java is missing a general notion of tuples. A Tuple combines a fixed number of elements together so that they can be passed around as a whole. Unlike an array or list, a tuple can hold objects with different types, but they are also immutable. +Tuples are of type Tuple1, Tuple2, Tuple3 and so on. There currently is an upper limit of 8 elements. To access elements of a tuple `t`, you can use method `t._1` to access the first element, `t._2` to access the second, and so on. + +==== Create a tuple +Here is an example of how to create a tuple holding a String and an Integer: + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/TupleDemo.java[tags=createTuple] +---- +<1> A tuple is created via the static factory method `Tuple.of()` +<2> Get the 1st element of this tuple. +<3> Get the 2nd element of this tuple. + +==== Map a tuple component-wise + +The component-wise map evaluates a function per element in the tuple, returning another tuple. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/TupleDemo.java[tags=bimapTuple] +---- + +==== Map a tuple using one mapper + +It is also possible to map a tuple using one mapping function. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/TupleDemo.java[tags=mapTuple] +---- + +==== Transform a tuple + +Transform creates a new type based on the tuple's contents. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/TupleDemo.java[tags=transformTuple] +---- + +=== Functions + +Functional programming is all about values and transformation of values using functions. Java 8 just provides a `Function` which accepts one parameter and a `BiFunction` which accepts two parameters. Vavr provides functions up to a limit of 8 parameters. The functional interfaces are of called `Function0, Function1, Function2, Function3` and so on. If you need a function which throws a checked exception you can use `CheckedFunction1, CheckedFunction2` and so on. +The following lambda expression creates a function to sum two integers: + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithLambda] +---- + +This is a shorthand for the following anonymous class definition: + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithAnonymousClass] +---- + +You can also use the static factory method `Function3.of(...)` to a create a function from any method reference. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithFactoryMethod] +---- + +In fact Vavr functional interfaces are Java 8 functional interfaces on steroids. They also provide features like: + +* Composition +* Lifting +* Currying +* Memoization + +==== Composition +You can compose functions. In mathematics, function composition is the application of one function to the result of another to produce a third function. For instance, the functions f : X → Y and g : Y → Z can be composed to yield a function `h: g(f(x))` which maps X -> Z. +You can use either `andThen`: + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=composeFunctions1] +---- + +or `compose`: + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=composeFunctions2] +---- + +==== Lifting +You can lift a partial function into a total function that returns an `Option` result. The term _partial function_ comes from mathematics. A partial function from X to Y is a function f: X′ → Y, for some subset X′ of X. It generalizes the concept of a function f: X → Y by not forcing f to map every element of X to an element of Y. That means a partial function works properly only for some input values. If the function is called with a disallowed input value, it will typically throw an exception. + +The following method `divide` is a partial function that only accepts non-zero divisors. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=partialDivideFunction] +---- + +We use `lift` to turn `divide` into a total function that is defined for all inputs. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=liftedDivideFunction] +---- + +<1> A lifted function returns `None` instead of throwing an exception, if the function is invoked with disallowed input values. +<2> A lifted function returns `Some`, if the function is invoked with allowed input values. + +The following method `sum` is a partial function that only accepts positive input values. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=partialFunctionExample] +---- +<1> The function `sum` throws an `IllegalArgumentException` for negative input values. + +We may lift the `sum` method by providing the methods reference. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=liftMethodReference] +---- +<1> The lifted function catches the `IllegalArgumentException` and maps it to `None`. + +==== Partial application +Partial application allows you to derive a new function from an existing one by fixing some values. You can fix one or more parameters, and the number of fixed parameters defines the arity of the new function such that `new arity = (original arity - fixed parameters)`. The parameters are bound from left to right. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=partialApplicationFunction] +---- +<1> The first parameter `a` is fixed to the value 2. + +This can be demonstrated by fixing the first three parameters of a `Function5`, resulting in a `Function2`. +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=partialApplicationFunctionArity5] +---- +<1> The `a`, `b` and `c` parameters are fixed to the values 2, 3 and 1 respectively. + +Partial application differs from <>, as will be explored in the relevant section. + +==== Currying +Currying is a technique to partially apply a function by fixing a value for one of the parameters, resulting in a `Function1` function that returns a `Function1`. + +When a `Function2` is _curried_, the result is indistinguishable from the _partial application_ of a `Function2` because both result in a 1-arity function. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=curryingFunction] +---- +<1> The first parameter `a` is fixed to the value 2. + +You might notice that, apart from the use of `.curried()`, this code is identical to the 2-arity given example in <>. With higher-arity functions, the difference becomes clear. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=curryingFunctionArity3] +---- +<1> Note the presence of additional functions in the parameters. +<2> Further calls to `apply` returns another `Function1`, apart from the final call. + +==== Memoization +Memoization is a form of caching. A memoized function executes only once and then returns the result from a cache. +The following example calculates a random number on the first invocation and returns the cached number on the second invocation. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/FunctionsDemo.java[tags=memoizedFunction] +---- + +=== Values +In a functional setting we see a value as a kind of https://en.wikipedia.org/wiki/Normal_form_(abstract_rewriting)[normal form], an expression which cannot be further evaluated. In Java we express this by making the state of an object final and call it https://en.wikipedia.org/wiki/Immutable_object[immutable]. +Vavr's functional Value abstracts over immutable objects. Efficient write operations are added by sharing immutable memory between instances. What we get is thread-safety for free! + +==== Option +Option is a monadic container type which represents an optional value. Instances of Option are either an instance of `Some` or the `None`. + +[source,java,indent=0] +---- +// optional *value*, no more nulls +Option option = Option.of(...); +---- + +If you're coming to Vavr after using Java's `Optional` class, there is a crucial difference. In `Optional`, a call to `.map` that results in a null will result in an empty `Optional`. In Vavr, it would result in a `Some(null)` that can then lead to a `NullPointerException`. + +Using `Optional`, this scenario is valid. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/OptionDemo.java[tags=javaOptionalWithMappedNull] +---- +<1> The option is `Some("foo")` +<2> The resulting option becomes empty here + +Using Vavr's `Option`, the same scenario will result in a `NullPointerException`. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/OptionDemo.java[tags=vavrOptionWithMappedNull] +---- +<1> The option is `Some("foo")` +<2> The resulting option is `Some(null)` +<3> The call to `s.toUpperCase()` is invoked on a `null` + +This seems like Vavr's implementation is broken, but in fact it's not - rather, it adheres to the requirement of a monad to maintain computational context when calling `.map`. In terms of an `Option`, this means that calling `.map` on a `Some` will result in a `Some`, and calling `.map` on a `None` will result in a `None`. In the Java `Optional` example above, that context changed from a `Some` to a `None`. + +This may seem to make `Option` useless, but it actually forces you to pay attention to possible occurrences of `null` and deal with them accordingly instead of unknowingly accepting them. The correct way to deal with occurrences of `null` is to use `flatMap`. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/OptionDemo.java[tags=flatMapNullParameter] +---- +<1> The option is `Some("foo")` +<2> The resulting option is `Some(null)` +<3> `s`, which is `null`, becomes `None` + +Alternatively, move the `.flatMap` to be co-located with the the possibly `null` value. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/OptionDemo.java[tags=mapOptionParameter] +---- +<1> The option is `Some("foo")` +<2> The resulting option is `None` + +This is explored in more detail on the http://blog.vavr.io/the-agonizing-death-of-an-astronaut/[Vavr blog]. + +==== Try +Try is a monadic container type which represents a computation that may either result in an exception, or return a successfully computed value. It's similar to, but semantically different from `Either`. Instances of Try, are either an instance of `Success` or `Failure`. + +[source,java,indent=0] +---- +// no need to handle exceptions +Try.of(() -> bunchOfWork()).getOrElse(other); +---- + +[source,java,indent=0] +---- +import static io.vavr.API.*; // $, Case, Match +import static io.vavr.Predicates.*; // instanceOf + +A result = Try.of(this::bunchOfWork) + .recover(x -> Match(x).of( + Case($(instanceOf(Exception_1.class)), t -> somethingWithException(t)), + Case($(instanceOf(Exception_2.class)), t -> somethingWithException(t)), + Case($(instanceOf(Exception_n.class)), t -> somethingWithException(t)) + )) + .getOrElse(other); +---- + +==== Lazy +Lazy is a monadic container type which represents a lazy evaluated value. Compared to a Supplier, Lazy is memoizing, i.e. it evaluates only once and therefore is referentially transparent. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/LazyDemo.java[tags=createLazy] +---- + +You may also create a real lazy value (works only with interfaces): + +[source,java,indent=0] +---- +CharSequence chars = Lazy.val(() -> "Yay!", CharSequence.class); +---- + +==== Either +Either represents a value of two possible types. An Either is either a Left or a Right. If the given Either is a Right and projected to a Left, the Left operations have no effect on the Right value. If the given Either is a Left and projected to a Right, the Right operations have no effect on the Left value. If a Left is projected to a Left or a Right is projected to a Right, the operations have an effect. + +Example: A compute() function, which results either in an Integer value (in the case of success) or in an error message of type String (in the case of failure). By convention the success case is Right and the failure is Left. + +[source,java,indent=0] +---- +Either value = compute().right().map(i -> i * 2).toEither(); +---- + +If the result of compute() is Right(1), the value is Right(2). +If the result of compute() is Left("error"), the value is Left("error"). + +==== Future +A Future is a computation result that becomes available at some point. All operations provided are non-blocking. The underlying ExecutorService is used to execute asynchronous handlers, e.g. via onComplete(...). + +A Future has two states: pending and completed. + +*Pending:* The computation is ongoing. Only a pending future may be completed or cancelled. + +*Completed:* The computation finished successfully with a result, failed with an exception or was cancelled. + +Callbacks may be registered on a Future at each point of time. These actions are performed as soon as the Future is completed. An action which is registered on a completed Future is immediately performed. The action may run on a separate Thread, depending on the underlying ExecutorService. Actions which are registered on a cancelled Future are performed with the failed result. + +[source,java,indent=0] +---- +// future *value*, result of an async calculation +Future future = Future.of(...); +---- + +==== Validation +The Validation control is an _applicative functor_ and facilitates accumulating errors. When trying to compose Monads, the combination process will short circuit at the first encountered error. But 'Validation' will continue processing the combining functions, accumulating all errors. This is especially useful when doing validation of multiple fields, say a web form, and you want to know all errors encountered, instead of one at a time. + +Example: We get the fields 'name' and 'age' from a web form and want to create either a valid Person instance, or return the list of validation errors. + +[source,java,indent=0] +---- +include::../../test/java/io/vavr/ValidationDemo.java[tags=validatePerson] +---- + +A valid value is contained in a `Validation.Valid` instance, a list of validation errors is contained in a `Validation.Invalid` instance. + +The following validator is used to combine different validation results to one `Validation` instance. + +---- +include::../../test/java/io/vavr/ValidationDemo.java[tags=personValidator] +---- + +If the validation succeeds, i.e. the input data is valid, then an instance of `Person` is created of the given fields `name` and `age`. + +---- +include::../../test/java/io/vavr/ValidationDemo.java[tags=person] +---- + +=== Collections + +Much effort has been put into designing an all-new collection library for Java which meets the requirements of functional programming, namely immutability. + +Java's Stream lifts a computation to a different layer and links to a specific collection in another explicit step. With Vavr we don't need all this additional boilerplate. + +The new collections are based on http://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html[java.lang.Iterable], so they leverage the sugared iteration style. + +[source,java] +---- +// 1000 random numbers +for (double random : Stream.continually(Math::random).take(1000)) { + ... +} +---- + +`TraversableOnce` has a huge amount of useful functions to operate on the collection. Its API is similar to http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html[java.util.stream.Stream] but more mature. + +==== List + +Vavr's `List` is an immutable linked list. Mutations create new instances. Most operations are performed in linear time. Consequent operations are executed one by one. + +===== Java 8 + +[source,java] +---- +Arrays.asList(1, 2, 3).stream().reduce((i, j) -> i + j); +---- + +[source,java] +---- +IntStream.of(1, 2, 3).sum(); +---- + +===== Vavr + +[source,java] +---- +// io.vavr.collection.List +List.of(1, 2, 3).sum(); +---- + +==== Stream + +The `io.vavr.collection.Stream` implementation is a lazy linked list. Values are computed only when needed. Because of its laziness, most operations are performed in constant time. Operations are intermediate in general and executed in a single pass. + +The stunning thing about streams is that we can use them to represent sequences that are (theoretically) infinitely long. + +[source,java] +---- +// 2, 4, 6, ... +Stream.from(1).filter(i -> i % 2 == 0); +---- + +==== Performance Characteristics + +.Time Complexity of Sequential Operations +[width="100%",frame="topbot",options="header"] +|==================================================================================================== +| | head() | tail() | get(int) | update(int, T) | prepend(T) | append(T) +| Array | const | linear | const | const | linear | linear +| CharSeq | const | linear | const | linear | linear | linear +| Iterator | const | const | — | — | — | — +| List | const | const | linear | linear | const | linear +| Queue | const | const^a^ | linear | linear | const | const +| PriorityQueue | log | log | — | — | log | log +| Stream | const | const | linear | linear | const^lazy^ | const^lazy^ +| Vector | const^eff^ | const^eff^ | const ^eff^ | const ^eff^ | const ^eff^ | const ^eff^ +|==================================================================================================== + +.Time Complexity of Map/Set Operations +[width="100%",frame="topbot",options="header"] +|================================================================= +| | contains/Key | add/put | remove | min +| HashMap | const^eff^ | const^eff^ | const^eff^ | linear +| HashSet | const^eff^ | const^eff^ | const^eff^ | linear +| LinkedHashMap | const^eff^ | linear | linear | linear +| LinkedHashSet | const^eff^ | linear | linear | linear +| Tree   | log | log | log | log +| TreeMap | log | log | log | log +| TreeSet | log | log | log | log +|================================================================= + +Legend: + +* const — constant time +* const^a^ — amortized constant time, few operations may take longer +* const^eff^ — effectively constant time, depending on assumptions like distribution of hash keys +* const^lazy^ — lazy constant time, the operation is deferred +* log — logarithmic time +* linear — linear time + +=== Property Checking + +Property checking (also known as http://en.wikipedia.org/wiki/Property_testing[property testing]) is a truly powerful way to test properties of our code in a functional way. It is based on generated random data, which is passed to a user defined check function. + +Vavr has property testing support in its `io.vavr:vavr-test` module, so make sure to include that in order to use it in your tests. + +[source,java] +---- +Arbitrary ints = Arbitrary.integer(); + +// square(int) >= 0: OK, passed 1000 tests. +Property.def("square(int) >= 0") + .forAll(ints) + .suchThat(i -> i * i >= 0) + .check() + .assertIsSatisfied(); +---- + +Generators of complex data structures are composed of simple generators. From 280c24ee62dadbdba177e71d7c29ce06bcaa91de Mon Sep 17 00:00:00 2001 From: Geovanny Mendoza Date: Tue, 26 Nov 2024 16:25:33 -0500 Subject: [PATCH 2/5] [0.0.1] update document --- src/docs/asciidoc/es/usage_guide_es.adoc | 236 ++++++++++++----------- 1 file changed, 119 insertions(+), 117 deletions(-) diff --git a/src/docs/asciidoc/es/usage_guide_es.adoc b/src/docs/asciidoc/es/usage_guide_es.adoc index fd9e9df..53ee78f 100644 --- a/src/docs/asciidoc/es/usage_guide_es.adoc +++ b/src/docs/asciidoc/es/usage_guide_es.adoc @@ -1,189 +1,191 @@ -== Usage Guide +== Guía de Uso -Vavr comes along with well-designed representations of some of the most basic types which apparently are missing or rudimentary in Java: `Tuple`, `Value` and `λ`. -In Vavr, everything is built upon these three basic building blocks: +Vavr incluye representaciones bien diseñadas de algunos de los tipos más básicos que, aparentemente, faltan o son rudimentarios en Java: `Tuple`, `Value` y `λ`. +En Vavr, todo se construye sobre estos tres bloques básicos: image::images/vavr-overview.png[Vavr Overview] -=== Tuples +=== Tuplas -Java is missing a general notion of tuples. A Tuple combines a fixed number of elements together so that they can be passed around as a whole. Unlike an array or list, a tuple can hold objects with different types, but they are also immutable. -Tuples are of type Tuple1, Tuple2, Tuple3 and so on. There currently is an upper limit of 8 elements. To access elements of a tuple `t`, you can use method `t._1` to access the first element, `t._2` to access the second, and so on. +Java carece de una noción general de tuplas. Una tupla combina un número fijo de elementos para que puedan ser tratados como un todo. A diferencia de un array o lista, una tupla puede contener objetos de diferentes tipos, pero también son inmutables. +Las tuplas tienen tipos como `Tuple1`, `Tuple2`, `Tuple3` y así sucesivamente. Actualmente, hay un límite máximo de 8 elementos. Para acceder a los elementos de una tupla `t`, puedes usar el método `t._1` para acceder al primer elemento, `t._2` para el segundo, y así sucesivamente. -==== Create a tuple -Here is an example of how to create a tuple holding a String and an Integer: +==== Crear una tupla + +Aquí tienes un ejemplo de cómo crear una tupla que contiene un `String` y un `Integer`: [source,java,indent=0] ---- -include::../../test/java/io/vavr/TupleDemo.java[tags=createTuple] +include::../../../test/java/io/vavr/TupleDemo.java[tags=createTuple] ---- -<1> A tuple is created via the static factory method `Tuple.of()` -<2> Get the 1st element of this tuple. -<3> Get the 2nd element of this tuple. +<1> Se crea una tupla mediante el método de fábrica estático `Tuple.of()` +<2> Obtén el primer elemento de esta tupla. +<3> Obtén el segundo elemento de esta tupla. -==== Map a tuple component-wise +==== Mapear una tupla elemento por elemento -The component-wise map evaluates a function per element in the tuple, returning another tuple. +El mapeo elemento por elemento evalúa una función por cada elemento de la tupla, devolviendo otra tupla. [source,java,indent=0] ---- -include::../../test/java/io/vavr/TupleDemo.java[tags=bimapTuple] +include::../../../test/java/io/vavr/TupleDemo.java[tags=bimapTuple] ---- -==== Map a tuple using one mapper +==== Mapear una tupla usando un único mapeador -It is also possible to map a tuple using one mapping function. +También es posible mapear una tupla usando una sola función de mapeo. [source,java,indent=0] ---- -include::../../test/java/io/vavr/TupleDemo.java[tags=mapTuple] +include::../../../test/java/io/vavr/TupleDemo.java[tags=mapTuple] ---- -==== Transform a tuple +==== Transformar una tupla -Transform creates a new type based on the tuple's contents. +La transformación crea un nuevo tipo basado en el contenido de la tupla. [source,java,indent=0] ---- -include::../../test/java/io/vavr/TupleDemo.java[tags=transformTuple] +include::../../../test/java/io/vavr/TupleDemo.java[tags=transformTuple] ---- -=== Functions +=== Funciones -Functional programming is all about values and transformation of values using functions. Java 8 just provides a `Function` which accepts one parameter and a `BiFunction` which accepts two parameters. Vavr provides functions up to a limit of 8 parameters. The functional interfaces are of called `Function0, Function1, Function2, Function3` and so on. If you need a function which throws a checked exception you can use `CheckedFunction1, CheckedFunction2` and so on. -The following lambda expression creates a function to sum two integers: +La programación funcional se centra en los valores y en la transformación de valores mediante funciones. Java 8 solo proporciona una `Function` que acepta un parámetro y una `BiFunction` que acepta dos parámetros. Vavr proporciona funciones con un límite de hasta 8 parámetros. Las interfaces funcionales se denominan `Function0, Function1, Function2, Function3` y así sucesivamente. Si necesitas una función que lance una excepción comprobada, puedes usar `CheckedFunction1, CheckedFunction2` y así sucesivamente. +La siguiente expresión lambda crea una función para sumar dos enteros: [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithLambda] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithLambda] ---- -This is a shorthand for the following anonymous class definition: +Esto es una abreviatura para la siguiente definición de clase anónima: [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithAnonymousClass] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithAnonymousClass] ---- -You can also use the static factory method `Function3.of(...)` to a create a function from any method reference. +También puedes usar el método de fábrica estático `Function3.of(...)` para crear una función a partir de cualquier referencia de método. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithFactoryMethod] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithFactoryMethod] ---- -In fact Vavr functional interfaces are Java 8 functional interfaces on steroids. They also provide features like: -* Composition -* Lifting -* Currying -* Memoization +De hecho, las interfaces funcionales de Vavr son interfaces funcionales de Java 8 potenciadas. También ofrecen características como: + +* Composición +* Elevación (Lifting) +* Currificación (Currying) +* Memoización -==== Composition -You can compose functions. In mathematics, function composition is the application of one function to the result of another to produce a third function. For instance, the functions f : X → Y and g : Y → Z can be composed to yield a function `h: g(f(x))` which maps X -> Z. -You can use either `andThen`: +==== Composición +Puedes componer funciones. En matemáticas, la composición de funciones es la aplicación de una función al resultado de otra para producir una tercera función. Por ejemplo, las funciones f : X → Y and g : Y → Z pueden componerse para generar una función `h: g(f(x))` que mapea X -> Z. +Puedes usar `andThen`: [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=composeFunctions1] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=composeFunctions1] ---- -or `compose`: +o `compose`: [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=composeFunctions2] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=composeFunctions2] ---- -==== Lifting -You can lift a partial function into a total function that returns an `Option` result. The term _partial function_ comes from mathematics. A partial function from X to Y is a function f: X′ → Y, for some subset X′ of X. It generalizes the concept of a function f: X → Y by not forcing f to map every element of X to an element of Y. That means a partial function works properly only for some input values. If the function is called with a disallowed input value, it will typically throw an exception. +==== Elevación (__Lifting__) +Puedes elevar una función parcial a una función total que devuelve un resultado de tipo `Option`. El término _partial function_ proviene de las matemáticas. Una función parcial de X a Y es una función __f__: X′ → Y, para algún subconjunto X′ de X. Generaliza el concepto de una función __f__: X → Y al no forzar que __f__ asocie cada elemento de X a un elemento de Y. Esto significa que una función parcial funciona correctamente solo para algunos valores de entrada. Si se llama a la función con un valor de entrada no permitido, normalmente lanzará una excepción. -The following method `divide` is a partial function that only accepts non-zero divisors. +El siguiente método `divide` es una función parcial que solo acepta divisores distintos de cero. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=partialDivideFunction] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=partialDivideFunction] ---- -We use `lift` to turn `divide` into a total function that is defined for all inputs. +Usamos `lift` para convertir `divide` en una función total que está definida para todas las entradas. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=liftedDivideFunction] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=liftedDivideFunction] ---- -<1> A lifted function returns `None` instead of throwing an exception, if the function is invoked with disallowed input values. -<2> A lifted function returns `Some`, if the function is invoked with allowed input values. +<1> Una función elevada devuelve `None` en lugar de lanzar una excepción, si la función se invoca con valores de entrada no permitidos. +<2> Una función elevada devuelve `Some`, si la función se invoca con valores de entrada permitidos. -The following method `sum` is a partial function that only accepts positive input values. +El siguiente método `sum` es una función parcial que solo acepta valores de entrada positivos. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=partialFunctionExample] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=partialFunctionExample] ---- -<1> The function `sum` throws an `IllegalArgumentException` for negative input values. +<1> La función `sum` lanza una excepción `IllegalArgumentException` para valores de entrada negativos. -We may lift the `sum` method by providing the methods reference. +Podemos elevar el método `sum` proporcionando la referencia al método. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=liftMethodReference] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=liftMethodReference] ---- -<1> The lifted function catches the `IllegalArgumentException` and maps it to `None`. +<1> La función elevada captura la excepción `IllegalArgumentException` y la mapea a `None`. -==== Partial application -Partial application allows you to derive a new function from an existing one by fixing some values. You can fix one or more parameters, and the number of fixed parameters defines the arity of the new function such that `new arity = (original arity - fixed parameters)`. The parameters are bound from left to right. +==== Aplicación Parcial +La aplicación parcial te permite derivar una nueva función a partir de una existente fijando algunos valores. Puedes fijar uno o más parámetros, y el número de parámetros fijados define la aridad de la nueva función, de manera que `new arity = (original arity - fixed parameters)`. Los parámetros se asignan de izquierda a derecha. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=partialApplicationFunction] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=partialApplicationFunction] ---- -<1> The first parameter `a` is fixed to the value 2. +<1> El primer parámetro `a` se fija al valor 2. -This can be demonstrated by fixing the first three parameters of a `Function5`, resulting in a `Function2`. +Esto puede demostrarse fijando los primeros tres parámetros de una `Function5`, lo que resulta en una `Function2`. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=partialApplicationFunctionArity5] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=partialApplicationFunctionArity5] ---- -<1> The `a`, `b` and `c` parameters are fixed to the values 2, 3 and 1 respectively. +<1> Los parámetros `a`, `b` y `c` se fijan a los valores 2, 3 y 1, respectivamente. -Partial application differs from <>, as will be explored in the relevant section. +La aplicación parcial difiere de la <>, como se explorará en la sección correspondiente. -==== Currying -Currying is a technique to partially apply a function by fixing a value for one of the parameters, resulting in a `Function1` function that returns a `Function1`. +==== Currificación (Currying) +La currificación es una técnica que permite aplicar parcialmente una función fijando un valor para uno de los parámetros, lo que da como resultado una función `Function1` que devuelve otra función `Function1`. -When a `Function2` is _curried_, the result is indistinguishable from the _partial application_ of a `Function2` because both result in a 1-arity function. +Cuando una `Function2` es _curried_, el resultado es indistinguible de la __aplicación parcial__ de una `Function2` ya que ambas producen una función de aridad 1. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=curryingFunction] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=curryingFunction] ---- -<1> The first parameter `a` is fixed to the value 2. +<1> El primer parámetro `a` se fija al valor 2. -You might notice that, apart from the use of `.curried()`, this code is identical to the 2-arity given example in <>. With higher-arity functions, the difference becomes clear. +Podrás notar que, aparte del uso de `.curried()`, este código es idéntico al ejemplo de aridad 2 dado en <>. Con funciones de mayor aridad, la diferencia se vuelve evidente. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=curryingFunctionArity3] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=curryingFunctionArity3] ---- -<1> Note the presence of additional functions in the parameters. -<2> Further calls to `apply` returns another `Function1`, apart from the final call. +<1> Nota la presencia de funciones adicionales en los parámetros. +<2> Las llamadas posteriores a `apply` devuelven otra `Function1`, excepto en la llamada final. -==== Memoization -Memoization is a form of caching. A memoized function executes only once and then returns the result from a cache. -The following example calculates a random number on the first invocation and returns the cached number on the second invocation. +==== Memoización +La memoización es una forma de almacenamiento en caché. Una función memoizada se ejecuta solo una vez y luego devuelve el resultado desde una caché. +El siguiente ejemplo calcula un número aleatorio en la primera invocación y devuelve el número almacenado en caché en la segunda invocación. [source,java,indent=0] ---- -include::../../test/java/io/vavr/FunctionsDemo.java[tags=memoizedFunction] +include::../../../test/java/io/vavr/FunctionsDemo.java[tags=memoizedFunction] ---- === Values -In a functional setting we see a value as a kind of https://en.wikipedia.org/wiki/Normal_form_(abstract_rewriting)[normal form], an expression which cannot be further evaluated. In Java we express this by making the state of an object final and call it https://en.wikipedia.org/wiki/Immutable_object[immutable]. -Vavr's functional Value abstracts over immutable objects. Efficient write operations are added by sharing immutable memory between instances. What we get is thread-safety for free! +En un entorno funcional, vemos un valor como una especie de https://en.wikipedia.org/wiki/Normal_form_(abstract_rewriting)[forma normal], una expresión que no puede evaluarse más. En Java, expresamos esto haciendo que el estado de un objeto sea `final` y lo llamamos https://en.wikipedia.org/wiki/Immutable_object[objeto immutable]. +El valor funcional de Vavr abstrae sobre objetos inmutables. Las operaciones de escritura eficientes se logran compartiendo memoria inmutable entre instancias. ¡Esto nos proporciona seguridad en hilos automáticamente! ==== Option -Option is a monadic container type which represents an optional value. Instances of Option are either an instance of `Some` or the `None`. +`Option` es un tipo de contenedor monádico que representa un valor opcional. Las instancias de `Option` son ya sea una instancia de `Some` o `None`. [source,java,indent=0] ---- @@ -191,52 +193,52 @@ Option is a monadic container type which represents an optional value. Instances Option option = Option.of(...); ---- -If you're coming to Vavr after using Java's `Optional` class, there is a crucial difference. In `Optional`, a call to `.map` that results in a null will result in an empty `Optional`. In Vavr, it would result in a `Some(null)` that can then lead to a `NullPointerException`. +Si vienes a Vavr después de usar la clase `Optional` de Java, hay una diferencia crucial. En `Optional`, una llamada a `.map` que resulta en un valor `null` producirá un `Optional` vacío. En Vavr, esto generaría un `Some(null)`, lo que podría llevar a un `NullPointerException`. -Using `Optional`, this scenario is valid. +Usando `Optional`, este escenario es válido. [source,java,indent=0] ---- -include::../../test/java/io/vavr/OptionDemo.java[tags=javaOptionalWithMappedNull] +include::../../../test/java/io/vavr/OptionDemo.java[tags=javaOptionalWithMappedNull] ---- -<1> The option is `Some("foo")` -<2> The resulting option becomes empty here +<1> La opción es `Some("foo")`. +<2> La opción resultante se vuelve vacía aquí. -Using Vavr's `Option`, the same scenario will result in a `NullPointerException`. +Usando la `Option` de Vavr, el mismo escenario resultará en un `NullPointerException`. [source,java,indent=0] ---- -include::../../test/java/io/vavr/OptionDemo.java[tags=vavrOptionWithMappedNull] +include::../../../test/java/io/vavr/OptionDemo.java[tags=vavrOptionWithMappedNull] ---- -<1> The option is `Some("foo")` -<2> The resulting option is `Some(null)` -<3> The call to `s.toUpperCase()` is invoked on a `null` +<1> La opción es `Some("foo")` +<2> La opción resultante es `Some(null)` +<3> TLa llamada a `s.toUpperCase()` se invoca sobre un `null` -This seems like Vavr's implementation is broken, but in fact it's not - rather, it adheres to the requirement of a monad to maintain computational context when calling `.map`. In terms of an `Option`, this means that calling `.map` on a `Some` will result in a `Some`, and calling `.map` on a `None` will result in a `None`. In the Java `Optional` example above, that context changed from a `Some` to a `None`. +Esto puede parecer que la implementación de Vavr está rota, pero en realidad no lo está. Más bien, se adhiere al requisito de una mónada (__monad__) de mantener el contexto computacional al llamar a `.map`. En términos de una `Option`, esto significa que llamar a `.map` en un `Some` dará como resultado un `Some` y llamar a `.map` en un `None` dará como resultado un `None`. En el ejemplo de `Optional` de Java mencionado anteriormente, ese contexto cambió de un `Some` a un `None`. -This may seem to make `Option` useless, but it actually forces you to pay attention to possible occurrences of `null` and deal with them accordingly instead of unknowingly accepting them. The correct way to deal with occurrences of `null` is to use `flatMap`. +Esto puede parecer que hace que `Option` sea inútil, pero en realidad te obliga a prestar atención a las posibles ocurrencias de `null` y a manejarlas adecuadamente en lugar de aceptarlas sin saberlo. La forma correcta de manejar las ocurrencias de `null` es usar `flatMap`. [source,java,indent=0] ---- -include::../../test/java/io/vavr/OptionDemo.java[tags=flatMapNullParameter] +include::../../../test/java/io/vavr/OptionDemo.java[tags=flatMapNullParameter] ---- -<1> The option is `Some("foo")` -<2> The resulting option is `Some(null)` -<3> `s`, which is `null`, becomes `None` +<1> La opción es `Some("foo")` +<2> La opción resultante es `Some(null)` +<3> `s`, que es `null`, se convierte en `None` -Alternatively, move the `.flatMap` to be co-located with the the possibly `null` value. +Alternativamente, mueve el `.flatMap` para que esté ubicado junto al valor que posiblemente sea `null`. [source,java,indent=0] ---- -include::../../test/java/io/vavr/OptionDemo.java[tags=mapOptionParameter] +include::../../../test/java/io/vavr/OptionDemo.java[tags=mapOptionParameter] ---- -<1> The option is `Some("foo")` -<2> The resulting option is `None` +<1> La opción es `Some("foo")` +<2> La opción resultante es `None` -This is explored in more detail on the http://blog.vavr.io/the-agonizing-death-of-an-astronaut/[Vavr blog]. +Esto se explora en más detalle en el http://blog.vavr.io/the-agonizing-death-of-an-astronaut/[blog de Vavr]. ==== Try -Try is a monadic container type which represents a computation that may either result in an exception, or return a successfully computed value. It's similar to, but semantically different from `Either`. Instances of Try, are either an instance of `Success` or `Failure`. +`Try` es un tipo de contenedor monádico que representa una computación que puede resultar en una excepción o devolver un valor calculado exitosamente. Es similar a `Either`, pero semánticamente diferente. Una instancia de `Try` puede ser una instancia de `Success` o `Failure`. [source,java,indent=0] ---- @@ -259,14 +261,14 @@ A result = Try.of(this::bunchOfWork) ---- ==== Lazy -Lazy is a monadic container type which represents a lazy evaluated value. Compared to a Supplier, Lazy is memoizing, i.e. it evaluates only once and therefore is referentially transparent. +`Lazy` es un tipo de contenedor monádico que representa un valor evaluado de forma perezosa (__lazy__). En comparación con un `Supplier`, `Lazy` realiza __memoización__, es decir, se evalúa solo una vez y, por lo tanto, es referencialmente transparente. [source,java,indent=0] ---- -include::../../test/java/io/vavr/LazyDemo.java[tags=createLazy] +include::../../../test/java/io/vavr/LazyDemo.java[tags=createLazy] ---- -You may also create a real lazy value (works only with interfaces): +También puedes crear un valor realmente perezoso (__lazy__) (__esto solo funciona con interfaces__): [source,java,indent=0] ---- @@ -274,28 +276,28 @@ CharSequence chars = Lazy.val(() -> "Yay!", CharSequence.class); ---- ==== Either -Either represents a value of two possible types. An Either is either a Left or a Right. If the given Either is a Right and projected to a Left, the Left operations have no effect on the Right value. If the given Either is a Left and projected to a Right, the Right operations have no effect on the Left value. If a Left is projected to a Left or a Right is projected to a Right, the operations have an effect. +`Either` representa un valor de dos tipos posibles. Un `Either` es, o bien un `Left`, o bien un `Right`. Si un `Either` dado es un `Right` y se proyecta a un `Left`, las operaciones de `Left` no tienen efecto sobre el valor de `Right`. Si un `Either` dado es un `Left` y se proyecta a un `Right`, las operaciones de `Right` no tienen efecto sobre el valor de `Left`. Si un `Left` se proyecta a un `Left`, o un `Right` se proyecta a un `Right`, las operaciones sí tienen efecto. -Example: A compute() function, which results either in an Integer value (in the case of success) or in an error message of type String (in the case of failure). By convention the success case is Right and the failure is Left. +Ejemplo: Una función `compute()`, que da como resultado un valor de tipo `Integer` (en el caso de éxito) o un mensaje de error de tipo `String` (en el caso de fallo). Por convención, el caso de éxito es `Right` y el de fallo es `Left`. [source,java,indent=0] ---- Either value = compute().right().map(i -> i * 2).toEither(); ---- -If the result of compute() is Right(1), the value is Right(2). -If the result of compute() is Left("error"), the value is Left("error"). +Si el resultado de `compute()` es `Right(1)`, el valor es `Right(2)`. +Si el resultado de `compute()` es `Left("error")`, el valor es `Left("error")`. ==== Future -A Future is a computation result that becomes available at some point. All operations provided are non-blocking. The underlying ExecutorService is used to execute asynchronous handlers, e.g. via onComplete(...). +Un `Future` es el resultado de una computación que estará disponible en algún momento. Todas las operaciones proporcionadas son __no bloqueantes__. El `ExecutorService` subyacente se utiliza para ejecutar controladores asíncronos, por ejemplo, mediante `onComplete(...)`. -A Future has two states: pending and completed. +Un `Future` tiene dos estados: __pendiente__ y __completado__. -*Pending:* The computation is ongoing. Only a pending future may be completed or cancelled. +*Pendiente:* La computación está en curso. Solo un `Future` pendiente puede completarse o cancelarse. -*Completed:* The computation finished successfully with a result, failed with an exception or was cancelled. +*Completado:* La computación finalizó exitosamente con un resultado, falló con una excepción o fue cancelada. -Callbacks may be registered on a Future at each point of time. These actions are performed as soon as the Future is completed. An action which is registered on a completed Future is immediately performed. The action may run on a separate Thread, depending on the underlying ExecutorService. Actions which are registered on a cancelled Future are performed with the failed result. +Los __callbacks__ pueden registrarse en un `Future` en cualquier momento. Estas acciones se ejecutan tan pronto como el `Future` se completa. Una acción registrada en un `Future` completado se ejecuta inmediatamente. La acción puede ejecutarse en un hilo separado, dependiendo del `ExecutorService` subyacente. Las acciones registradas en un `Future` cancelado se ejecutan con el resultado fallido. [source,java,indent=0] ---- @@ -303,14 +305,14 @@ Callbacks may be registered on a Future at each point of time. These actions are Future future = Future.of(...); ---- -==== Validation -The Validation control is an _applicative functor_ and facilitates accumulating errors. When trying to compose Monads, the combination process will short circuit at the first encountered error. But 'Validation' will continue processing the combining functions, accumulating all errors. This is especially useful when doing validation of multiple fields, say a web form, and you want to know all errors encountered, instead of one at a time. +==== Validación (Validation) +El control de validación (__Validation__) es un __funtor aplicativo__ que facilita la acumulación de errores. Al intentar componer mónadas, el proceso de combinación se detendrá en el primer error encontrado. Sin embargo, `Validation` continuará procesando las funciones de combinación, acumulando todos los errores. Esto es especialmente útil al validar múltiples campos, como un formulario web, cuando deseas conocer todos los errores encontrados en lugar de uno por uno. -Example: We get the fields 'name' and 'age' from a web form and want to create either a valid Person instance, or return the list of validation errors. +Ejemplo: Obtenemos los campos `name` y `age` de un formulario web y queremos crear una instancia válida de `Person`, o devolver la lista de errores de validación. [source,java,indent=0] ---- -include::../../test/java/io/vavr/ValidationDemo.java[tags=validatePerson] +include::../../../test/java/io/vavr/ValidationDemo.java[tags=validatePerson] ---- A valid value is contained in a `Validation.Valid` instance, a list of validation errors is contained in a `Validation.Invalid` instance. @@ -318,7 +320,7 @@ A valid value is contained in a `Validation.Valid` instance, a list of validatio The following validator is used to combine different validation results to one `Validation` instance. ---- -include::../../test/java/io/vavr/ValidationDemo.java[tags=personValidator] +include::../../../test/java/io/vavr/ValidationDemo.java[tags=personValidator] ---- If the validation succeeds, i.e. the input data is valid, then an instance of `Person` is created of the given fields `name` and `age`. From 5a2d14316b55d443cd20ece694ef7a3bdcb00eb3 Mon Sep 17 00:00:00 2001 From: Geovanny Mendoza Date: Tue, 26 Nov 2024 23:43:43 -0500 Subject: [PATCH 3/5] V[0.0.1] documentation translated into Spanish --- src/docs/asciidoc/es/index_es.adoc | 4 +- src/docs/asciidoc/es/license_es.adoc | 13 + src/docs/asciidoc/es/pattern_matching_es.adoc | 248 ++++++++++++++++++ src/docs/asciidoc/es/usage_guide_es.adoc | 52 ++-- 4 files changed, 289 insertions(+), 28 deletions(-) create mode 100644 src/docs/asciidoc/es/license_es.adoc create mode 100644 src/docs/asciidoc/es/pattern_matching_es.adoc diff --git a/src/docs/asciidoc/es/index_es.adoc b/src/docs/asciidoc/es/index_es.adoc index e183e22..9dfffc0 100644 --- a/src/docs/asciidoc/es/index_es.adoc +++ b/src/docs/asciidoc/es/index_es.adoc @@ -16,6 +16,6 @@ include::getting_started_es.adoc[] include::usage_guide_es.adoc[] -#include::pattern_matching.adoc[] +include::pattern_matching_es.adoc[] -#include::license.adoc[] +include::license_es.adoc[] diff --git a/src/docs/asciidoc/es/license_es.adoc b/src/docs/asciidoc/es/license_es.adoc new file mode 100644 index 0000000..84bfe66 --- /dev/null +++ b/src/docs/asciidoc/es/license_es.adoc @@ -0,0 +1,13 @@ +== License + +Copyright 2014-2018 Vavr, http://vavr.io + +Licenciado bajo la Licencia Apache, Versión 2.0 (la "Licencia"); +no puedes usar este archivo excepto en cumplimiento con la Licencia. +Puedes obtener una copia de la Licencia en: + +http://www.apache.org/licenses/LICENSE-2.0 + +A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye "TAL CUAL", +SIN GARANTÍAS O CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. +Consulta la Licencia para conocer los permisos y las limitaciones bajo la Licencia. diff --git a/src/docs/asciidoc/es/pattern_matching_es.adoc b/src/docs/asciidoc/es/pattern_matching_es.adoc new file mode 100644 index 0000000..03e410c --- /dev/null +++ b/src/docs/asciidoc/es/pattern_matching_es.adoc @@ -0,0 +1,248 @@ +=== Pattern Matching + +SScala tiene coincidencia de patrones (__pattern matching__) nativa, una de las ventajas sobre el Java __**puro**__. The basic syntax is close to Java'sLa sintaxis básica es similar al `switch` de Java: + +[source,java] +---- +val s = i match { + case 1 => "one" + case 2 => "two" + case _ => "?" +} +---- + +Notablemente, __match__ es una expresión, lo que significa que produce un resultado. Además, ofrece: + +* Parámetros nombrados: ``case i: Int => "Int " + i`` +* Desestructuración de objetos: ``case Some(i) => i`` +* Condiciones de guarda (guards): ``case Some(i) if i > 0 => "positive " + i`` +* Múltiples condiciones: ``case "-h" | "--help" => displayHelp`` +* Verificaciones en tiempo de compilación para exhaustividad + +El __**Pattern matching**__ es una gran característica que nos ahorra escribir cadenas de ramas `if-then-else`. Reduce la cantidad de código mientras se enfoca en las partes relevantes. + +==== Fundamentos de Match para Java + +Vavr proporciona una API de coincidencia (__match__) que es similar a la de Scala. Se habilita agregando el siguiente import a nuestra aplicación: + +[source,java] +---- +import static io.vavr.API.*; +---- + +Teniendo los métodos estáticos __Match__, __Case__ y los __patrones atómicos (__atomic patterns__)__ + +* ``$()`` - patrón comodín (__wildcard__) +* ``$(value)`` - patrón de igualdad +* ``$(predicate)`` - patrón condicional + +En el alcance, el ejemplo inicial de Scala puede expresarse de esta manera: + +[source,java] +---- +String s = Match(i).of( + Case($(1), "one"), + Case($(2), "two"), + Case($(), "?") +); +---- + +⚡ Usamos nombres de métodos en mayúsculas uniformes porque 'case' es una palabra clave en Java. Esto hace que la API sea especial. + +===== Exhaustividad (__Exhaustiveness__) + +El último patrón comodín (__wildcard__) ``$()`` nos protege de un `MatchError`, que se lanza si ningún caso coincide. + +Debido a que no podemos realizar verificaciones de exhaustividad como lo hace el compilador de Scala, ofrecemos la posibilidad de devolver un resultado opcional: + +[source,java] +---- +Option s = Match(i).option( + Case($(0), "zero") +); +---- + +===== Syntactic Sugar (__Azúcar Sintáctico__) + +Como se mostró anteriormente, ``Case`` permite coincidir con patrones condicionales. + +[source,java] +---- +Case($(predicate), ...) +---- + +Vavr ofrece un conjunto de predicados predeterminados. + +[source,java] +---- +import static io.vavr.Predicates.*; +---- + +Estos pueden usarse para expresar el ejemplo inicial de Scala de la siguiente manera: + +[source,java] +---- +String s = Match(i).of( + Case($(is(1)), "one"), + Case($(is(2)), "two"), + Case($(), "?") +); +---- + +**Condiciones Múltiples** + +Usamos el predicado ``isIn`` para verificar múltiples condiciones: + +[source,java] +---- +Case($(isIn("-h", "--help")), ...) +---- + +**Realizando Efectos Secundarios** + +`Match` actúa como una expresión y produce un valor. Para realizar efectos secundarios (__side-effects__), necesitamos usar la función auxiliar ``run`` que devuelve ``Void``: + +[source,java] +---- +Match(arg).of( + Case($(isIn("-h", "--help")), o -> run(this::displayHelp)), + Case($(isIn("-v", "--version")), o -> run(this::displayVersion)), + Case($(), o -> run(() -> { + throw new IllegalArgumentException(arg); + })) +); +---- + +⚡ ``run`` se utiliza para evitar ambigüedades y porque ``void`` no es un valor de retorno válido en Java. + +*Precaución:* ``run`` no debe usarse como valor de retorno directo, es decir, fuera del cuerpo de una lambda: + +[source,java] +---- +// Incorrecto +Case($(isIn("-h", "--help")), run(this::displayHelp)) +---- + +De lo contrario, los `Case` se evaluarán de forma anticipada __antes__ de que los patrones sean comparados, lo que rompe toda la expresión `Match`. En su lugar, se debe usar dentro del cuerpo de una lambda: + +[source,java] +---- +// Correcto +Case($(isIn("-h", "--help")), o -> run(this::displayHelp)) +---- + +Como podemos ver, ``run`` es propenso a errores si no se usa correctamente. Ten cuidado. Estamos considerando marcarlo como obsoleto en una versión futura y, tal vez, proporcionar una mejor API para realizar efectos secundarios. + +===== Parámetros Nombrados + +Vavr aprovecha las lambdas para proporcionar parámetros nombrados para los valores coincidentes. + +[source,java] +---- +Number plusOne = Match(obj).of( + Case($(instanceOf(Integer.class)), i -> i + 1), + Case($(instanceOf(Double.class)), d -> d + 1), + Case($(), o -> { throw new NumberFormatException(); }) +); +---- + +Hasta ahora, hemos coincidido valores directamente utilizando patrones atómicos. Si un patrón atómico coincide, el tipo correcto del objeto coincidente se infiere del contexto del patrón. + +A continuación, exploraremos patrones recursivos que pueden coincidir con gráficos de objetos de profundidad (teóricamente) arbitraria. + +===== Descomposición de Objetos + +En Java usamos constructores para instanciar clases. Entendemos la __descomposición de objetos__ como la destrucción de objetos en sus partes. + +Mientras que un constructor es una __función__ que se __aplica__ a los argumentos y devuelve una nueva instancia, un deconstructor es una función que toma una instancia y devuelve sus partes. Decimos que un objeto está __descompuesto__. + +La destrucción de objetos no necesariamente es una operación única. Por ejemplo, un `LocalDate` puede descomponerse en: + +* Los componentes de año, mes y día. +* El valor `long` que representa los milisegundos desde la época de un `Instant` correspondiente. +* etc. + +==== Patrones + +En Vavr usamos patrones para definir cómo se deconstruye una instancia de un tipo específico. Estos patrones pueden usarse junto con la API de coincidencia (`Match`). + +===== Patrones Predefinidos + +Para muchos tipos de Vavr ya existen patrones de coincidencia predefinidos. Estos se importan mediante + +[source,java] +---- +import static io.vavr.Patterns.*; +---- + +Por ejemplo, ahora podemos coincidir con el resultado de un `Try`: + +[source,java] +---- +Match(_try).of( + Case($Success($()), value -> ...), + Case($Failure($()), x -> ...) +); +---- + +⚡ Un primer prototipo de la API de coincidencia (`Match`) de Vavr permitía extraer una selección definida por el usuario de objetos a partir de un patrón de coincidencia. Sin el soporte adecuado del compilador, esto no es práctico porque el número de métodos generados crecía exponencialmente. La API actual hace un compromiso: todos los patrones se coinciden, pero solo los patrones raíz son __descompuestos__. + +[source,java] +---- +Match(_try).of( + Case($Success($Tuple2($("a"), $())), tuple2 -> ...), + Case($Failure($(instanceOf(Error.class))), error -> ...) +); +---- + +Aquí los patrones raíz son `Success` y `Failure`. Estos se descomponen en `Tuple2` y `Error`, teniendo los tipos genéricos correctos. + +⚡ Los tipos profundamente anidados se infieren según el argumento de `Match` y __**not**__ según los patrones coincidentes. + +===== Patrones Definidos por el Usuario + +Es esencial poder descomponer objetos arbitrarios, incluidas las instancias de clases finales. Vavr hace esto de forma declarativa al proporcionar las anotaciones en tiempo de compilación ``@Patterns`` y ``@Unapply``. + +Para habilitar el procesador de anotaciones, el artefacto http://search.maven.org/#search%7Cga%7C1%7Cvavr-match[vavr-match] debe añadirse como dependencia del proyecto. + +⚡ Nota: Por supuesto, los patrones pueden implementarse directamente sin usar el generador de código. Para más información, consulta el código fuente generado. + +[source,java] +---- +import io.vavr.match.annotation.*; + +@Patterns +class My { + + @Unapply + static Tuple1 Optional(java.util.Optional optional) { + return Tuple.of(optional.orElse(null)); + } +} +---- + +El procesador de anotaciones coloca un archivo `MyPatterns` en el mismo paquete (por defecto en `target/generated-sources`). También se admiten clases internas. Caso especial: si el nombre de la clase es `$`, el nombre de la clase generada será simplemente `Patterns`, sin prefijo. + +===== Guardas (__Guards__) + +Ahora podemos coincidir con objetos `Optionals` utilizando __guards__. + +[source,java] +---- +Match(optional).of( + Case($Optional($(v -> v != null)), "defined"), + Case($Optional($(v -> v == null)), "empty") +); +---- + +Los predicados podrían simplificarse implementando ``isNull`` y ``isNotNull``. + +⚡ ¡Y sí, extraer un `null` es extraño! En lugar de usar el `Optional` de Java, prueba con la `Option` de Vavr. + +[source,java] +---- +Match(option).of( + Case($Some($()), "defined"), + Case($None(), "empty") +); +---- diff --git a/src/docs/asciidoc/es/usage_guide_es.adoc b/src/docs/asciidoc/es/usage_guide_es.adoc index 53ee78f..879d574 100644 --- a/src/docs/asciidoc/es/usage_guide_es.adoc +++ b/src/docs/asciidoc/es/usage_guide_es.adoc @@ -315,27 +315,27 @@ Ejemplo: Obtenemos los campos `name` y `age` de un formulario web y queremos cre include::../../../test/java/io/vavr/ValidationDemo.java[tags=validatePerson] ---- -A valid value is contained in a `Validation.Valid` instance, a list of validation errors is contained in a `Validation.Invalid` instance. +Un valor válido está contenido en una instancia de `Validation.Valid`, mientras que una lista de errores de validación está contenida en una instancia de `Validation.Invalid`. -The following validator is used to combine different validation results to one `Validation` instance. +El siguiente validador se utiliza para combinar diferentes resultados de validación en una sola instancia de `Validation`. ---- include::../../../test/java/io/vavr/ValidationDemo.java[tags=personValidator] ---- -If the validation succeeds, i.e. the input data is valid, then an instance of `Person` is created of the given fields `name` and `age`. +Si la validación tiene éxito, es decir, si los datos de entrada son válidos, entonces se crea una instancia de `Person` con los campos `name` y `age` proporcionados. ---- -include::../../test/java/io/vavr/ValidationDemo.java[tags=person] +include::../../../test/java/io/vavr/ValidationDemo.java[tags=person] ---- -=== Collections +=== Colecciones -Much effort has been put into designing an all-new collection library for Java which meets the requirements of functional programming, namely immutability. +Se ha dedicado mucho esfuerzo a diseñar una biblioteca de colecciones completamente nueva para Java que cumpla con los requisitos de la programación funcional, especialmente la inmutabilidad. -Java's Stream lifts a computation to a different layer and links to a specific collection in another explicit step. With Vavr we don't need all this additional boilerplate. +El `Stream` de Java eleva una computación a una capa diferente y se vincula a una colección específica en otro paso explícito. Con Vavr, no necesitamos todo este código adicional repetitivo (__boilerplate__). -The new collections are based on http://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html[java.lang.Iterable], so they leverage the sugared iteration style. +Las nuevas colecciones están basadas en http://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html[java.lang.Iterable], lo que permite aprovechar un estilo de iteración simplificado. [source,java] ---- @@ -345,11 +345,11 @@ for (double random : Stream.continually(Math::random).take(1000)) { } ---- -`TraversableOnce` has a huge amount of useful functions to operate on the collection. Its API is similar to http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html[java.util.stream.Stream] but more mature. +`TraversableOnce` tiene una gran cantidad de funciones útiles para operar en la colección. Su API es similar a http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html[java.util.stream.Stream], pero es más madura. ==== List -Vavr's `List` is an immutable linked list. Mutations create new instances. Most operations are performed in linear time. Consequent operations are executed one by one. +La `List` de Vavr es una lista enlazada inmutable. Las mutaciones crean nuevas instancias. La mayoría de las operaciones se realizan en tiempo lineal. Las operaciones consecutivas se ejecutan una por una. ===== Java 8 @@ -373,9 +373,9 @@ List.of(1, 2, 3).sum(); ==== Stream -The `io.vavr.collection.Stream` implementation is a lazy linked list. Values are computed only when needed. Because of its laziness, most operations are performed in constant time. Operations are intermediate in general and executed in a single pass. +La implementación de `io.vavr.collection.Stream` es una lista enlazada perezosa (lazy). Los valores se calculan solo cuando se necesitan. Debido a su naturaleza perezosa, la mayoría de las operaciones se realizan en tiempo constante. En general, las operaciones son intermedias y se ejecutan en una sola pasada. -The stunning thing about streams is that we can use them to represent sequences that are (theoretically) infinitely long. +Lo sorprendente de los streams es que podemos usarlos para representar secuencias que son (teóricamente) infinitamente largas. [source,java] ---- @@ -383,9 +383,9 @@ The stunning thing about streams is that we can use them to represent sequences Stream.from(1).filter(i -> i % 2 == 0); ---- -==== Performance Characteristics +==== Características de Rendimiento -.Time Complexity of Sequential Operations +.Complejidad Temporal de las Operaciones Secuenciales [width="100%",frame="topbot",options="header"] |==================================================================================================== | | head() | tail() | get(int) | update(int, T) | prepend(T) | append(T) @@ -399,7 +399,7 @@ Stream.from(1).filter(i -> i % 2 == 0); | Vector | const^eff^ | const^eff^ | const ^eff^ | const ^eff^ | const ^eff^ | const ^eff^ |==================================================================================================== -.Time Complexity of Map/Set Operations +.Complejidad Temporal de las Operaciones en Map/Set [width="100%",frame="topbot",options="header"] |================================================================= | | contains/Key | add/put | remove | min @@ -412,20 +412,20 @@ Stream.from(1).filter(i -> i % 2 == 0); | TreeSet | log | log | log | log |================================================================= -Legend: +Leyenda: -* const — constant time -* const^a^ — amortized constant time, few operations may take longer -* const^eff^ — effectively constant time, depending on assumptions like distribution of hash keys -* const^lazy^ — lazy constant time, the operation is deferred -* log — logarithmic time -* linear — linear time +* const — tiempo constante. +* const^a^ — tiempo constante amortizado, algunas operaciones pueden tomar más tiempo. +* const^eff^ — tiempo efectivamente constante, dependiendo de suposiciones como la distribución de claves hash. +* const^lazy^ — tiempo constante perezoso (__lazy__), la operación se difiere. +* log — tiempo logarítmico. +* linear — tiempo lineal. -=== Property Checking +=== Verificación de Propiedades -Property checking (also known as http://en.wikipedia.org/wiki/Property_testing[property testing]) is a truly powerful way to test properties of our code in a functional way. It is based on generated random data, which is passed to a user defined check function. +La verificación de propiedades (también conocida como http://en.wikipedia.org/wiki/Property_testing[pruebas de propiedades]) es una forma realmente poderosa de probar propiedades de nuestro código de manera funcional. Se basa en la generación de datos aleatorios, que se pasan a una función de verificación definida por el usuario. -Vavr has property testing support in its `io.vavr:vavr-test` module, so make sure to include that in order to use it in your tests. +Vavr admite pruebas de propiedades en su módulo `io.vavr:vavr-test`, por lo que asegúrate de incluirlo para usarlo en tus pruebas. [source,java] ---- @@ -439,4 +439,4 @@ Property.def("square(int) >= 0") .assertIsSatisfied(); ---- -Generators of complex data structures are composed of simple generators. +Los generadores de estructuras de datos complejas se componen de generadores simples. From 920291a189786dd2940f0d7685560df37b504bc3 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 6 Dec 2024 18:19:45 +0100 Subject: [PATCH 4/5] Reorganize content --- build.gradle | 10 +- ...g_started_es.adoc => getting_started.adoc} | 0 src/docs/asciidoc/{pl => es}/index.adoc | 4 +- src/docs/asciidoc/es/index_es.adoc | 21 - ...introduction_es.adoc => introduction.adoc} | 0 .../es/{license_es.adoc => license.adoc} | 0 ...matching_es.adoc => pattern_matching.adoc} | 0 .../{usage_guide_es.adoc => usage_guide.adoc} | 0 src/docs/asciidoc/pl/getting_started.adoc | 86 ---- src/docs/asciidoc/pl/images/binarytree1.png | Bin 6738 -> 0 bytes src/docs/asciidoc/pl/images/binarytree2.png | Bin 10237 -> 0 bytes .../asciidoc/pl/images/collections-seq.png | Bin 12474 -> 0 bytes .../pl/images/collections-set-map.png | Bin 13335 -> 0 bytes src/docs/asciidoc/pl/images/list1.png | Bin 2815 -> 0 bytes src/docs/asciidoc/pl/images/list2.png | Bin 3525 -> 0 bytes src/docs/asciidoc/pl/images/queue1.png | Bin 4955 -> 0 bytes src/docs/asciidoc/pl/images/queue2.png | Bin 3191 -> 0 bytes .../asciidoc/pl/images/vavr-collections.png | Bin 14746 -> 0 bytes src/docs/asciidoc/pl/images/vavr-overview.png | Bin 77665 -> 0 bytes src/docs/asciidoc/pl/introduction.adoc | 392 ---------------- src/docs/asciidoc/pl/license.adoc | 15 - src/docs/asciidoc/pl/pattern_matching.adoc | 248 ---------- src/docs/asciidoc/pl/usage_guide.adoc | 440 ------------------ 23 files changed, 7 insertions(+), 1209 deletions(-) rename src/docs/asciidoc/es/{getting_started_es.adoc => getting_started.adoc} (100%) rename src/docs/asciidoc/{pl => es}/index.adoc (78%) delete mode 100644 src/docs/asciidoc/es/index_es.adoc rename src/docs/asciidoc/es/{introduction_es.adoc => introduction.adoc} (100%) rename src/docs/asciidoc/es/{license_es.adoc => license.adoc} (100%) rename src/docs/asciidoc/es/{pattern_matching_es.adoc => pattern_matching.adoc} (100%) rename src/docs/asciidoc/es/{usage_guide_es.adoc => usage_guide.adoc} (100%) delete mode 100644 src/docs/asciidoc/pl/getting_started.adoc delete mode 100644 src/docs/asciidoc/pl/images/binarytree1.png delete mode 100644 src/docs/asciidoc/pl/images/binarytree2.png delete mode 100644 src/docs/asciidoc/pl/images/collections-seq.png delete mode 100644 src/docs/asciidoc/pl/images/collections-set-map.png delete mode 100644 src/docs/asciidoc/pl/images/list1.png delete mode 100644 src/docs/asciidoc/pl/images/list2.png delete mode 100644 src/docs/asciidoc/pl/images/queue1.png delete mode 100644 src/docs/asciidoc/pl/images/queue2.png delete mode 100644 src/docs/asciidoc/pl/images/vavr-collections.png delete mode 100644 src/docs/asciidoc/pl/images/vavr-overview.png delete mode 100644 src/docs/asciidoc/pl/introduction.adoc delete mode 100644 src/docs/asciidoc/pl/license.adoc delete mode 100644 src/docs/asciidoc/pl/pattern_matching.adoc delete mode 100644 src/docs/asciidoc/pl/usage_guide.adoc diff --git a/build.gradle b/build.gradle index ceb2f93..007454d 100644 --- a/build.gradle +++ b/build.gradle @@ -79,12 +79,12 @@ asciidoctor { } } -tasks.register('asciidoc_pl', AsciidoctorTask) { +tasks.register('asciidoc_es', AsciidoctorTask) { group = 'documentation' - description = 'Generates documentation for the "pl" directory.' + description = 'Generates documentation for the "es" directory.' - sourceDir = file('src/docs/asciidoc/pl') - outputDir = file("$buildDir/docs/asciidoc/pl") + sourceDir = file('src/docs/asciidoc/es') + outputDir = file("$buildDir/docs/asciidoc/es") options backend: 'html5' @@ -114,7 +114,7 @@ tasks.register('copyCNAME', Copy) { into file(asciidoctor.outputDir.path) } -asciidoctor.dependsOn asciidoc_pl +asciidoctor.dependsOn asciidoc_es copyCNAME.dependsOn asciidoctor publishGhPages.dependsOn copyCNAME diff --git a/src/docs/asciidoc/es/getting_started_es.adoc b/src/docs/asciidoc/es/getting_started.adoc similarity index 100% rename from src/docs/asciidoc/es/getting_started_es.adoc rename to src/docs/asciidoc/es/getting_started.adoc diff --git a/src/docs/asciidoc/pl/index.adoc b/src/docs/asciidoc/es/index.adoc similarity index 78% rename from src/docs/asciidoc/pl/index.adoc rename to src/docs/asciidoc/es/index.adoc index f33a75d..30b7655 100644 --- a/src/docs/asciidoc/pl/index.adoc +++ b/src/docs/asciidoc/es/index.adoc @@ -1,5 +1,5 @@ -= Vavr Dokumentacja Techniczna -Daniel Dietrich, Robert Winkler, Grzegorz Piwowarek += Guía del usuario de Vavr +Daniel Dietrich, Robert Winkler :toc: left :toclevels: 3 :source-highlighter: coderay diff --git a/src/docs/asciidoc/es/index_es.adoc b/src/docs/asciidoc/es/index_es.adoc deleted file mode 100644 index 9dfffc0..0000000 --- a/src/docs/asciidoc/es/index_es.adoc +++ /dev/null @@ -1,21 +0,0 @@ -= Guía del usuario de Vavr -Daniel Dietrich, Robert Winkler -:toc: left -:toclevels: 3 -:source-highlighter: coderay -:numbered: -:hardbreaks: -:revnumber: {project-version} -:revdate: {localdate} -:icons: font -:pagenums: - -include::introduction_es.adoc[] - -include::getting_started_es.adoc[] - -include::usage_guide_es.adoc[] - -include::pattern_matching_es.adoc[] - -include::license_es.adoc[] diff --git a/src/docs/asciidoc/es/introduction_es.adoc b/src/docs/asciidoc/es/introduction.adoc similarity index 100% rename from src/docs/asciidoc/es/introduction_es.adoc rename to src/docs/asciidoc/es/introduction.adoc diff --git a/src/docs/asciidoc/es/license_es.adoc b/src/docs/asciidoc/es/license.adoc similarity index 100% rename from src/docs/asciidoc/es/license_es.adoc rename to src/docs/asciidoc/es/license.adoc diff --git a/src/docs/asciidoc/es/pattern_matching_es.adoc b/src/docs/asciidoc/es/pattern_matching.adoc similarity index 100% rename from src/docs/asciidoc/es/pattern_matching_es.adoc rename to src/docs/asciidoc/es/pattern_matching.adoc diff --git a/src/docs/asciidoc/es/usage_guide_es.adoc b/src/docs/asciidoc/es/usage_guide.adoc similarity index 100% rename from src/docs/asciidoc/es/usage_guide_es.adoc rename to src/docs/asciidoc/es/usage_guide.adoc diff --git a/src/docs/asciidoc/pl/getting_started.adoc b/src/docs/asciidoc/pl/getting_started.adoc deleted file mode 100644 index 47b39ae..0000000 --- a/src/docs/asciidoc/pl/getting_started.adoc +++ /dev/null @@ -1,86 +0,0 @@ -== Getting started - -Projects that include Vavr need to target Java 1.8 at minimum. - -The .jar is available at http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22io.vavr%22%20a%3A%22vavr%22[Maven Central]. - -=== Gradle - -[source,groovy] -[subs="attributes"] ----- -dependencies { - compile "io.vavr:vavr:{project-version}" -} ----- - -Gradle 7+ - -[source,groovy] -[subs="attributes"] ----- -dependencies { - implementation "io.vavr:vavr:{project-version}" -} ----- - -=== Maven - -[source,xml] ----- - - - io.vavr - vavr - 0.10.5 - - ----- - -=== Standalone - -Because Vavr does __not__ depend on any libraries (other than the JVM) you can easily add it as standalone .jar to your classpath. - -=== Snapshots - -Developer versions can be found https://oss.sonatype.org/content/repositories/snapshots/io/vavr/vavr[here]. - -==== Gradle - -Add the additional snapshot repository to your `build.gradle`: - -[source,groovy] ----- -repositories { - (...) - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } -} ----- - -==== Maven - -Ensure that your ``~/.m2/settings.xml`` contains the following: - -[source,xml] ----- - - - allow-snapshots - - true - - - - snapshots-repo - https://oss.sonatype.org/content/repositories/snapshots - - false - - - true - - - - - ----- diff --git a/src/docs/asciidoc/pl/images/binarytree1.png b/src/docs/asciidoc/pl/images/binarytree1.png deleted file mode 100644 index db8aa9e083928abef5f1a59c60a238013070b072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6738 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 diff --git a/src/docs/asciidoc/pl/images/binarytree2.png b/src/docs/asciidoc/pl/images/binarytree2.png deleted file mode 100644 index 8f0e0ccb2170a9fe9e87e035e49f5aab32ca4a23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10237 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 DcC%>S diff --git a/src/docs/asciidoc/pl/images/collections-seq.png b/src/docs/asciidoc/pl/images/collections-seq.png deleted file mode 100644 index 285696b11153327cc7477406c646c5c460f6c4ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12474 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 diff --git a/src/docs/asciidoc/pl/images/queue1.png b/src/docs/asciidoc/pl/images/queue1.png deleted file mode 100644 index 75c350a7aa173309672db564e49860d6ed414829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4955 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 Z{|DwJN3eONPq+X8002ovPDHLkV1hY$?Lq(m diff --git a/src/docs/asciidoc/pl/images/queue2.png b/src/docs/asciidoc/pl/images/queue2.png deleted file mode 100644 index 63e4d663c0e64eaacfa9b054d20ab0f6a6763ac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3191 zcmV--42biIP)Px%{ZLF)MgRZ*?d|P?f`Z)K-2D9g`1tto@$mov0R8>_ z{{H^@`uel8vy6<4_V)Js`}_Cz_q)5h>gwuDOibY5;KjwoO-)Vf>+ALQ_U!EJ$jHdw z-{08S*v7`jv9YmZV`F7yWx~S3n3$NpzP_-qu$-KnaBy&ce}CQG-TC?X=H})iA|fg( zDw~^|^78UFHZ~O%6&o8H@bB+HKtSW;FMd$*Vpdu?$6K9czAf_<>kY}!vX>V z=;-Lm%F5Bv(eu)f+S=NYk&(E#xC8_QW@cu4dwZ>|t%iq(fPjFsw6q=`9;vCR|Nr^Y znNd!V(k?D8)YQ~bQBnW@@Bjc)n3|d5;^GGe2h7aOii(QAzrU50mAALI0RaK~|No$% zprxgy(DncS_{&`Z01ONab8~YO6BArqTx@J?Nl8f<7#Nz<_a-JL_x}H#Pymt4@;p2| zC@3guYHCGAMOau^$n*d5|NsC0<`EGQwY9ZXRaL92t3g3QPM6ZolRyAYqW}Of?f?HS z00000M2pGtLPA2A%=S1qIP=q(PEJm}y}c_dEBW4^003c;M*u+p0QcUl`PG;}PG#M& zZKuoZyXybhvV%^S+4}VH_x}4pk<<10@-s6t`su`AU|;}RsBek5@a5v%>ihrbv~;oK z06|QvC7Nw|W#?KwbbXd6lcKNI@$AER3<0aCJ{8Ws$eHid6tV zp5@%!tJ3l6_y2;o+k(gP0s#WZ$kUP1`(>BS&Y)e8F97AjlHB0y^5xad>HW8ZGEaG% z(vmCd$&rzXfuFIe;HFNiX8`W<_*^dlEM=;(dRIX%F6#I4Pj7_#_xE`N06=iCgK^2v6ILICRS z)aB*xE>B*0F8~Uz+}HpB2^dL4K~#9!?VJZ#8%Gw$S0M4UGOPrWC6JJf12&Rl*=!Kf zf`l+KqJsg0D5hTMCJta6TaM$yEk4_EY$vf}r#P2-DVN@Rz21B8z4usxxYMhY~Troc(LNzz{>!we1GP_COZ#7U{L z0lK*h8DSmw#rBTTB#I2@Xl(8ZaD+HI+mr67xYuYyU5Lt?sa=ua&54TJ>$ek0SqhFu!5s%}5?Kg$ zQeI+I+@)q+FgHC0hnX2?(nrUw_uGk7SaO#~#eFPQ8PrPTLFQ<=t-%r9$liKanEl)` zdv`?)oe~{)a?H7N zL%4}#kAH$z)g1%w;&9v#f9s*Amk>8W)bH?5G>>RPx!-psdi(v?#D*JHHu=;%rM~jn zPhxT346rRaZi1*B^ONr>n!~;KM?Z)W_i1?GeCIr+z5$=Z;bv`ebp+gUh0;Q|!=S6) zV6fFQEoteFHq|DdG4tB$?yjz;iCz}Gd3-pC`_Ws&`uW{o?u?lG)c4{3=l}3p(__Co zfA-gPH{C*Ym?!_8GYUgIDqA{xF2)ZW`|2-P_w-66vR^-e7w_SpLvGoZMdk zxNCo;+^13HZ@t8h8|0vG0{nKP|Nq@r8#0t4<-bWL1&Yogn|wJEEsySuuqy20Nw$E$<={89AYiKjTYcijlkxHDou-w2!0 z*B}4%#CEtIS?jiq@Z!@q!)-(@9OCciHQ#OA`JL#;_qG1@zuv^;ka+%6>77^3ZdMTY zmM;Pv17 zCN}YWnzQCrc=5>tuxIcLR3|<+Rp)ncw{)KQ+Beaa2XBedyyXLM zo&Sq?TH8x>#m%;jaa~N*4&g5$zw&8Ibs+x^~ zb*9DOR%#8Ka$ryOWgLowKCVk;7hrdpEiZ|40UfO?<}wu}pIPBv#i8MTt}AYj(^<*{ z))iyVja-q|x0H=`;B8^u(e27cBaq}?M=rEE5--Q9y<;rVVGB6ZB5vYyudyYiW9NsW+S@9Yhcne4o3zbIUJfa#->iy zDZ<>R(7vE0Pj6#f>AdA)Z2CM)U|(<%?9C<;B+-T5>|z676=$mpX@tGNKCo3{_Ug0a zi+L$NTkkbXtW*2Ii^0w2%gA&I_EarjrP>p$GHQX02h^=fYXWVT@RXfSuqvnfbWyn3 z{3uExlPP&irl6z?rnsOy4@zN@@sz zxkYY1+*^M5lV7~v^YF8eqwKX^Z@*dh+@FcF&prA0HZ1O%kKZF0?(HZ6>h}jG|8nx+ znSa24-hsFFv)OBhaJbndvipR?{hM>Ou=(~^;p%h$KL5&p8+X>i&wqRs4mX?7^s)Uy z;r?Y0QR`noJ9Ote=zC+&+$1g@+#zX>OPKrR9+bBA*W2yM*X)Cj{Og}D_smV&i;#QE zN1^c(g7I^d*7*`NzVWxe_aN@Kf%S7tZb8NK?I=UD<`LwfulJz*&&g*_AbVeb$=ttd z?Ck028kEB(<-ULG#CeOzEpm(8BDcsba=+)?My0kG34neA#x)}&oiWV zuZ1fd{KzG(&CZpVF=|1&x&Ns`bZ&h{*-#1O47RSzicDKeQ#v3gPUR|27N)sbgD0ix znGE07p?+SE89Y9isY)}Lr}DXlIKmZHt-eU3T2_`-UQto8W?@xS#JQ_8eQhp70WI7| z4WfK*YpUAT;yAX+7yhKeyYjWG+R}>R&9qX$Pgq3YI@*lRE}#cVq^D~ZR(g7xi>WWp z)ml)JJV6K;oRV4WdAaIH&o21SENByw6jFgdNR*T+WI78S@!mpT9d002ovPDHLkV1nX!ng;*? diff --git a/src/docs/asciidoc/pl/images/vavr-collections.png b/src/docs/asciidoc/pl/images/vavr-collections.png deleted file mode 100644 index 38ae50b612be7be2b1803975d2e7f9c6de26c86f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14746 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 diff --git a/src/docs/asciidoc/pl/images/vavr-overview.png b/src/docs/asciidoc/pl/images/vavr-overview.png deleted file mode 100644 index 5b299a9c98f396d6732d4bd53625e5f714536a35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77665 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%0D6YBEPc&4((Tx_^*4;mM0Cr>n?PNjeg_pS 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 divide(Integer dividend, Integer divisor) { - return Try.of(() -> dividend / divisor); -} - ----- - -This version of divide does not throw any exception anymore. We made the possible failure explicit by using the type Try. - -==== Referential Transparency - -A function, or more generally an expression, is called https://en.wikipedia.org/wiki/Referential_transparency[referentially transparent] if a call can be replaced by its value without affecting the behavior of the program. Simply spoken, given the same input the output is always the same. - -[source,java] ----- -// not referentially transparent -Math.random(); - -// referentially transparent -Math.max(1, 2); - ----- - -A function is called https://en.wikipedia.org/wiki/Pure_function[pure] if all expressions involved are referentially transparent. An application composed of pure functions will most probably __just work__ if it compiles. We are able to reason about it. Unit tests are easy to write and debugging becomes a relict of the past. - -==== Thinking in Values - -Rich Hickey, the creator of Clojure, gave a great talk about https://www.youtube.com/watch?v=-6BsiVyC1kM[The Value of Values]. The most interesting values are https://en.wikipedia.org/wiki/Immutable_object[immutable] values. The main reason is that immutable values - -* are inherently thread-safe and hence do not need to be synchronized -* are stable regarding __equals__ and __hashCode__ and thus are reliable hash keys -* do not need to be cloned -* behave type-safe when used in unchecked covariant casts (Java-specific) -The key to a better Java is to use __immutable values__ paired with __referentially transparent functions__. - -Vavr provides the necessary http://static.javadoc.io/io.vavr/vavr/0.10.5/io/vavr/control/package-summary.html[controls] and https://static.javadoc.io/io.vavr/vavr/0.10.4/io/vavr/collection/package-summary.html[collections] to accomplish this goal in every-day Java programming. - -=== Data Structures in a Nutshell - -Vavr’s collection library comprises of a rich set of functional data structures built on top of lambdas. The only interface they share with Java’s original collections is Iterable. The main reason is that the mutator methods of Java’s collection interfaces do not return an object of the underlying collection type. - -We will see why this is so essential by taking a look at the different types of data structures. - -==== Mutable Data Structures - -Java is an object-oriented programming language. We encapsulate state in objects to achieve data hiding and provide mutator methods to control the state. The https://en.wikipedia.org/wiki/Java_collections_framework[Java collections framework (JCF)] is built upon this idea. - -[source,java] ----- -interface Collection { - // removes all elements from this collection - void clear(); -} - ----- - -Today I comprehend a __void__ return type as a smell. It is evidence that https://en.wikipedia.org/wiki/Side_effect_(computer_science)[side-effects] take place, state is mutated. __Shared__ mutable state is an important source of failure, not only in a concurrent setting. - -==== Immutable Data Structures - -https://en.wikipedia.org/wiki/Immutable_object[Immutable] data structures cannot be modified after their creation. In the context of Java they are widely used in the form of collection wrappers. - -[source,java] ----- -List list = Collections.unmodifiableList(otherList); - -// Boom! -list.add("why not?"); - ----- - -There are various libraries that provide us with similar utility methods. The result is always an unmodifiable view of the specific collection. Typically it will throw at runtime when we call a mutator method. - -==== Persistent Data Structures - -A https://en.wikipedia.org/wiki/Persistent_data_structure[persistent data structure] does preserve the previous version of itself when being modified and is therefore __effectively__ immutable. Fully persistent data structures allow both updates and queries on any version. - -Many operations perform only small changes. Just copying the previous version wouldn’t be efficient. To save time and memory, it is crucial to identify similarities between two versions and share as much data as possible. - -This model does not impose any implementation details. Here come functional data structures into play. - -=== Functional Data Structures - -Also known as https://en.wikipedia.org/wiki/Purely_functional[__purely__ functional data structures], these are __immutable__ and __persistent__. The methods of functional data structures are __referentially transparent__. - -Vavr features a wide range of the most-commonly used functional data structures. The following examples are explained in-depth. - -==== Linked List - -One of the most popular and also simplest functional data structures is the https://en.wikipedia.org/wiki/Linked_list[(singly) linked List]. It has a __head__ element and a __tail__ List. A linked List behaves like a Stack which follows the https://en.wikipedia.org/wiki/Stack_(abstract_data_type)[last in, first out (LIFO)] method. - -In http://vavr.io/[Vavr] we instantiate a List like this: - -[source,java] ----- -// = List(1, 2, 3) -List list1 = List.of(1, 2, 3); ----- - -Each of the List elements forms a separate List node. The tail of the last element is Nil, the empty List. - -image::images/list1.png?w=660[List 1] - -This enables us to share elements across different versions of the List. - -[source,java] ----- -// = List(0, 2, 3) -List list2 = list1.tail().prepend(0); ----- - -The new head element 0 is __linked__ to the tail of the original List. The original List remains unmodified. - -image::images/list2.png?w=660[List 2] - -These operations take place in constant time, in other words they are independent of the List size. Most of the other operations take linear time. In Vavr this is expressed by the interface LinearSeq, which we may already know from Scala. - -If we need data structures that are queryable in constant time, Vavr offers Array and Vector. Both have https://en.wikipedia.org/wiki/Random_access[random access] capabilities. - -The Array type is backed by a Java array of objects. Insert and remove operations take linear time. Vector is in-between Array and List. It performs well in both areas, random access and modification. - -In fact the linked List can also be used to implement a Queue data structure. - -==== Queue - -A very efficient functional Queue can be implemented based on two linked Lists. The __front__ List holds the elements that are __dequeued__, the __rear__ List holds the elements that are __enqueued__. Both operations enqueue and dequeue perform in O(1). - -[source,java] ----- -Queue queue = Queue.of(1, 2, 3) - .enqueue(4) - .enqueue(5); ----- - -The initial Queue is created of three elements. Two elements are enqueued on the rear List. - -image::images/queue1.png?w=660[Queue 1] - -If the front List runs out of elements when dequeueing, the rear List is reversed and becomes the new front List. - -image::images/queue2.png?w=660[Queue 2] - -When dequeueing an element we get a pair of the first element and the remaining Queue. It is necessary to return the new version of the Queue because functional data structures are immutable and persistent. The original Queue is not affected. - -[source,java] ----- -Queue queue = Queue.of(1, 2, 3); - -// = (1, Queue(2, 3)) -Tuple2> dequeued = - queue.dequeue(); ----- - -What happens when the Queue is empty? Then dequeue() will throw a NoSuchElementException. To do it the __functional way__ we would rather expect an optional result. - -[source,java] ----- -// = Some((1, Queue())) -Queue.of(1).dequeueOption(); - -// = None -Queue.empty().dequeueOption(); ----- - -An optional result may be further processed, regardless if it is empty or not. - -[source,java] ----- -// = Queue(1) -Queue queue = Queue.of(1); - -// = Some((1, Queue())) -Option>> dequeued = - queue.dequeueOption(); - -// = Some(1) -Option element = dequeued.map(Tuple2::_1); - -// = Some(Queue()) -Option> remaining = - dequeued.map(Tuple2::_2); ----- - -==== Sorted Set - -Sorted Sets are data structures that are more frequently used than Queues. We use binary search trees to model them in a functional way. These trees consist of nodes with up to two children and values at each node. - -We build binary search trees in the presence of an ordering, represented by an element Comparator. All values of the left subtree of any given node are strictly less than the value of the given node. All values of the right subtree are strictly greater. - -[source,java] ----- -// = TreeSet(1, 2, 3, 4, 6, 7, 8) -SortedSet xs = TreeSet.of(6, 1, 3, 2, 4, 7, 8); ----- - -image::images/binarytree1.png?w=660[Binary Tree 1] - -Searches on such trees run in O(log n) time. We start the search at the root and decide if we found the element. Because of the total ordering of the values we know where to search next, in the left or in the right branch of the current tree. - -[source,java] ----- -// = TreeSet(1, 2, 3); -SortedSet set = TreeSet.of(2, 3, 1, 2); - -// = TreeSet(3, 2, 1); -Comparator c = (a, b) -> b - a; -SortedSet reversed = TreeSet.of(c, 2, 3, 1, 2); ----- - -Most tree operations are inherently https://en.wikipedia.org/wiki/Recursion[recursive]. The insert function behaves similarly to the search function. When the end of a search path is reached, a new node is created and the whole path is reconstructed up to the root. Existing child nodes are referenced whenever possible. Hence the insert operation takes O(log n) time and space. - -[source,java] ----- -// = TreeSet(1, 2, 3, 4, 5, 6, 7, 8) -SortedSet ys = xs.add(5); ----- - -image::images/binarytree2.png?w=660[Binary Tree 2] - -In order to maintain the performance characteristics of a binary search tree it needs to be kept balanced. All paths from the root to a leaf need to have roughly the same length. - -In Vavr we implemented a binary search tree based on a https://en.wikipedia.org/wiki/Red%E2%80%93black_tree[Red/Black Tree]. It uses a specific coloring strategy to keep the tree balanced on inserts and deletes. To read more about this topic please refer to the book http://www.amazon.com/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504[Purely Functional Data Structures] by Chris Okasaki. - -=== State of the Collections - -Generally we are observing a convergence of programming languages. Good features make it, other disappear. But Java is different, it is bound forever to be backward compatible. That is a strength but also slows down evolution. - -Lambda brought Java and Scala closer together, yet they are still so different. Martin Odersky, the creator of Scala, recently mentioned in his https://www.youtube.com/watch?v=NW5h8d_ZyOs[BDSBTB 2015 keynote] the state of the Java 8 collections. - -He described Java’s Stream as a fancy form of an Iterator. The Java 8 Stream API is an example of a __lifted__ collection. What it does is to __define__ a computation and __link__ it to a specific collection in another explicit step. - - -[source,java] ----- -// i + 1 -i.prepareForAddition() - .add(1) - .mapBackToInteger(Mappers.toInteger()) ----- - -This is how the new Java 8 Stream API works. It is a computational layer above the well known Java collections. - -[source,java] ----- -// = ["1", "2", "3"] in Java 8 -Arrays.asList(1, 2, 3) - .stream() - .map(Object::toString) - .collect(Collectors.toList()) ----- - -Vavr is greatly inspired by Scala. This is how the above example should have been in Java 8. - -[source,java] ----- -// = Stream("1", "2", "3") in Vavr -Stream.of(1, 2, 3).map(Object::toString) ----- - -Within the last year we put much effort into implementing the Vavr collection library. It comprises the most widely used collection types. - -==== Seq - -We started our journey by implementing sequential types. We already described the linked List above. Stream, a lazy linked List, followed. It allows us to process possibly infinite long sequences of elements. - -image::images/collections-seq.png?w=660[Seq] - -All collections are Iterable and hence could be used in enhanced for-statements. - -[source,java] ----- -for (String s : List.of("Java", "Advent")) { - // side effects and mutation -} ----- - -We could accomplish the same by internalizing the loop and injecting the behavior using a lambda. - -[source,java] ----- -List.of("Java", "Advent").forEach(s -> { - // side effects and mutation -}); ----- - -Anyway, as we previously saw we prefer expressions that return a value over statements that return nothing. By looking at a simple example, soon we will recognize that statements add noise and divide what belongs together. - -[source,java] ----- -String join(String... words) { - StringBuilder builder = new StringBuilder(); - for(String s : words) { - if (builder.length() > 0) { - builder.append(", "); - } - builder.append(s); - } - return builder.toString(); -} ----- - -The Vavr collections provide us with many functions to operate on the underlying elements. This allows us to express things in a very concise way. - -[source,java] ----- -String join(String... words) { - return List.of(words) - .intersperse(", ") - .foldLeft(new StringBuilder(), StringBuilder::append) - .toString(); -} ----- - -Most goals can be accomplished in various ways using Vavr. Here we reduced the whole method body to fluent function calls on a List instance. We could even remove the whole method and directly use our List to obtain the computation result. - -[source,java] ----- -List.of(words).mkString(", "); ----- - -In a real world application we are now able to drastically reduce the number of lines of code and hence lower the risk of bugs. - -==== Set and Map - -Sequences are great. But to be complete, a collection library also needs different types of Sets and Maps. - -image::images/collections-set-map.png?w=660[Set and Map] - -We described how to model sorted Sets with binary tree structures. A sorted Map is nothing else than a sorted Set containing key-value pairs and having an ordering for the keys. - -The HashMap implementation is backed by a http://lampwww.epfl.ch/papers/idealhashtrees.pdf[Hash Array Mapped Trie (HAMT)]. Accordingly the HashSet is backed by a HAMT containing key-key pairs. - -Our Map does __not__ have a special Entry type to represent key-value pairs. Instead we use Tuple2 which is already part of Vavr. The fields of a Tuple are enumerated. - -[source,java] ----- -// = (1, "A") -Tuple2 entry = Tuple.of(1, "A"); - -Integer key = entry._1; -String value = entry._2; ----- - -Maps and Tuples are used throughout Vavr. Tuples are inevitable to handle multi-valued return types in a general way. - -[source,java] ----- -// = HashMap((0, List(2, 4)), (1, List(1, 3))) -List.of(1, 2, 3, 4).groupBy(i -> i % 2); - -// = List((a, 0), (b, 1), (c, 2)) -List.of('a', 'b', 'c').zipWithIndex(); ----- - -At Vavr, we explore and test our library by implementing the https://projecteuler.net/archives[99 Euler Problems]. It is a great proof of concept. Please don’t hesitate to send pull requests. diff --git a/src/docs/asciidoc/pl/license.adoc b/src/docs/asciidoc/pl/license.adoc deleted file mode 100644 index 0c3a4dc..0000000 --- a/src/docs/asciidoc/pl/license.adoc +++ /dev/null @@ -1,15 +0,0 @@ -== License - -Copyright 2014-2018 Vavr, https://vavr.io - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/src/docs/asciidoc/pl/pattern_matching.adoc b/src/docs/asciidoc/pl/pattern_matching.adoc deleted file mode 100644 index 242676f..0000000 --- a/src/docs/asciidoc/pl/pattern_matching.adoc +++ /dev/null @@ -1,248 +0,0 @@ -=== Pattern Matching - -Scala has native pattern matching, one of the advantages over __plain__ Java. The basic syntax is close to Java's switch: - -[source,java] ----- -val s = i match { - case 1 => "one" - case 2 => "two" - case _ => "?" -} ----- - -Notably __match__ is an expression, it yields a result. Furthermore it offers - -* named parameters ``case i: Int => "Int " + i`` -* object deconstruction ``case Some(i) => i`` -* guards ``case Some(i) if i > 0 => "positive " + i`` -* multiple conditions ``case "-h" | "--help" => displayHelp`` -* compile-time checks for exhaustiveness - -Pattern matching is a great feature that saves us from writing stacks of if-then-else branches. It reduces the amount of code while focusing on the relevant parts. - -==== The Basics of Match for Java - -Vavr provides a match API that is close to Scala's match. It is enabled by adding the following import to our application: - -[source,java] ----- -import static io.vavr.API.*; ----- - -Having the static methods __Match__, __Case__ and the __atomic patterns__ - -* ``$()`` - wildcard pattern -* ``$(value)`` - equals pattern -* ``$(predicate)`` - conditional pattern - -in scope, the initial Scala example can be expressed like this: - -[source,java] ----- -String s = Match(i).of( - Case($(1), "one"), - Case($(2), "two"), - Case($(), "?") -); ----- - -⚡ We use uniform upper-case method names because 'case' is a keyword in Java. This makes the API special. - -===== Exhaustiveness - -The last wildcard pattern ``$()`` saves us from a MatchError which is thrown if no case matches. - -Because we can't perform exhaustiveness checks like the Scala compiler, we provide the possibility to return an optional result: - -[source,java] ----- -Option s = Match(i).option( - Case($(0), "zero") -); ----- - -===== Syntactic Sugar - -As already shown, ``Case`` allows to match conditional patterns. - -[source,java] ----- -Case($(predicate), ...) ----- - -Vavr offers a set of default predicates. - -[source,java] ----- -import static io.vavr.Predicates.*; ----- - -These can be used to express the initial Scala example as follows: - -[source,java] ----- -String s = Match(i).of( - Case($(is(1)), "one"), - Case($(is(2)), "two"), - Case($(), "?") -); ----- - -**Multiple Conditions** - -We use the ``isIn`` predicate to check multiple conditions: - -[source,java] ----- -Case($(isIn("-h", "--help")), ...) ----- - -**Performing Side-Effects** - -Match acts like an expression, it results in a value. In order to perform side-effects we need to use the helper function ``run`` which returns ``Void``: - -[source,java] ----- -Match(arg).of( - Case($(isIn("-h", "--help")), o -> run(this::displayHelp)), - Case($(isIn("-v", "--version")), o -> run(this::displayVersion)), - Case($(), o -> run(() -> { - throw new IllegalArgumentException(arg); - })) -); ----- - -⚡ ``run`` is used to get around ambiguities and because ``void`` isn't a valid return value in Java. - -*Caution:* ``run`` must not be used as direct return value, i.e. outside of a lambda body: - -[source,java] ----- -// Wrong! -Case($(isIn("-h", "--help")), run(this::displayHelp)) ----- - -Otherwise the Cases will be eagerly evaluated __before__ the patterns are matched, which breaks the whole Match expression. Instead we use it within a lambda body: - -[source,java] ----- -// Ok -Case($(isIn("-h", "--help")), o -> run(this::displayHelp)) ----- - -As we can see, ``run`` is error prone if not used right. Be careful. We consider deprecating it in a future release and maybe we will also provide a better API for performing side-effects. - -===== Named Parameters - -Vavr leverages lambdas to provide named parameters for matched values. - -[source,java] ----- -Number plusOne = Match(obj).of( - Case($(instanceOf(Integer.class)), i -> i + 1), - Case($(instanceOf(Double.class)), d -> d + 1), - Case($(), o -> { throw new NumberFormatException(); }) -); ----- - -So far we directly matched values using atomic patterns. If an atomic pattern matches, the right type of the matched object is inferred from the context of the pattern. - -Next, we will take a look at recursive patterns that are able to match object graphs of (theoretically) arbitrary depth. - -===== Object Decomposition - -In Java we use constructors to instantiate classes. We understand __object decomposition__ as destruction of objects into their parts. - -While a constructor is a __function__ which is __applied__ to arguments and returns a new instance, a deconstructor is a function which takes an instance and returns the parts. We say an object is __unapplied__. - -Object destruction is not necessarily a unique operation. For example, a LocalDate can be decomposed to - -* the year, month and day components -* the long value representing the epoch milliseconds of the corresponding Instant -* etc. - -==== Patterns - -In Vavr we use patterns to define how an instance of a specific type is deconstructed. These patterns can be used in conjunction with the Match API. - -===== Predefined Patterns - -For many Vavr types there already exist match patterns. They are imported via - -[source,java] ----- -import static io.vavr.Patterns.*; ----- - -For example we are now able to match the result of a Try: - -[source,java] ----- -Match(_try).of( - Case($Success($()), value -> ...), - Case($Failure($()), x -> ...) -); ----- - -⚡ A first prototype of Vavr's Match API allowed to extract a user-defined selection of objects from a match pattern. Without proper compiler support this isn't practicable because the number of generated methods exploded exponentially. The current API makes the compromise that all patterns are matched but only the root patterns are __decomposed__. - -[source,java] ----- -Match(_try).of( - Case($Success($Tuple2($("a"), $())), tuple2 -> ...), - Case($Failure($(instanceOf(Error.class))), error -> ...) -); ----- - -Here the root patterns are Success and Failure. They are decomposed to Tuple2 and Error, having the correct generic types. - -⚡ Deeply nested types are inferred according to the Match argument and __not__ according to the matched patterns. - -===== User-Defined Patterns - -It is essential to be able to unapply arbitrary objects, including instances of final classes. Vavr does this in a declarative style by providing the compile time annotations ``@Patterns`` and ``@Unapply``. - -To enable the annotation processor the artifact http://search.maven.org/#search%7Cga%7C1%7Cvavr-match[vavr-match] needs to be added as project dependency. - -⚡ Note: Of course the patterns can be implemented directly without using the code generator. For more information take a look at the generated source. - -[source,java] ----- -import io.vavr.match.annotation.*; - -@Patterns -class My { - - @Unapply - static Tuple1 Optional(java.util.Optional optional) { - return Tuple.of(optional.orElse(null)); - } -} ----- - -The annotation processor places a file MyPatterns in the same package (by default in target/generated-sources). Inner classes are also supported. Special case: if the class name is $, the generated class name is just Patterns, without prefix. - -===== Guards - -Now we are able to match Optionals using __guards__. - -[source,java] ----- -Match(optional).of( - Case($Optional($(v -> v != null)), "defined"), - Case($Optional($(v -> v == null)), "empty") -); ----- - -The predicates could be simplified by implementing ``isNull`` and ``isNotNull``. - -⚡ And yes, extracting null is weird. Instead of using Java's Optional give Vavr's Option a try! - -[source,java] ----- -Match(option).of( - Case($Some($()), "defined"), - Case($None(), "empty") -); ----- diff --git a/src/docs/asciidoc/pl/usage_guide.adoc b/src/docs/asciidoc/pl/usage_guide.adoc deleted file mode 100644 index b3f8f93..0000000 --- a/src/docs/asciidoc/pl/usage_guide.adoc +++ /dev/null @@ -1,440 +0,0 @@ -== Usage Guide - -Vavr comes along with well-designed representations of some of the most basic types which apparently are missing or rudimentary in Java: `Tuple`, `Value` and `λ`. -In Vavr, everything is built upon these three basic building blocks: - -image::images/vavr-overview.png[Vavr Overview] - -=== Tuples - -Java is missing a general notion of tuples. A Tuple combines a fixed number of elements together so that they can be passed around as a whole. Unlike an array or list, a tuple can hold objects with different types, but they are also immutable. -Tuples are of type Tuple1, Tuple2, Tuple3 and so on. There currently is an upper limit of 8 elements. To access elements of a tuple `t`, you can use method `t._1` to access the first element, `t._2` to access the second, and so on. - -==== Create a tuple -Here is an example of how to create a tuple holding a String and an Integer: - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/TupleDemo.java[tags=createTuple] ----- -<1> A tuple is created via the static factory method `Tuple.of()` -<2> Get the 1st element of this tuple. -<3> Get the 2nd element of this tuple. - -==== Map a tuple component-wise - -The component-wise map evaluates a function per element in the tuple, returning another tuple. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/TupleDemo.java[tags=bimapTuple] ----- - -==== Map a tuple using one mapper - -It is also possible to map a tuple using one mapping function. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/TupleDemo.java[tags=mapTuple] ----- - -==== Transform a tuple - -Transform creates a new type based on the tuple's contents. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/TupleDemo.java[tags=transformTuple] ----- - -=== Functions - -Functional programming is all about values and transformation of values using functions. Java 8 just provides a `Function` which accepts one parameter and a `BiFunction` which accepts two parameters. Vavr provides functions up to a limit of 8 parameters. The functional interfaces are of called `Function0, Function1, Function2, Function3` and so on. If you need a function which throws a checked exception you can use `CheckedFunction1, CheckedFunction2` and so on. -The following lambda expression creates a function to sum two integers: - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithLambda] ----- - -This is a shorthand for the following anonymous class definition: - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithAnonymousClass] ----- - -You can also use the static factory method `Function3.of(...)` to a create a function from any method reference. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=createFunctionWithFactoryMethod] ----- - -In fact Vavr functional interfaces are Java 8 functional interfaces on steroids. They also provide features like: - -* Composition -* Lifting -* Currying -* Memoization - -==== Composition -You can compose functions. In mathematics, function composition is the application of one function to the result of another to produce a third function. For instance, the functions f : X → Y and g : Y → Z can be composed to yield a function `h: g(f(x))` which maps X -> Z. -You can use either `andThen`: - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=composeFunctions1] ----- - -or `compose`: - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=composeFunctions2] ----- - -==== Lifting -You can lift a partial function into a total function that returns an `Option` result. The term _partial function_ comes from mathematics. A partial function from X to Y is a function f: X′ → Y, for some subset X′ of X. It generalizes the concept of a function f: X → Y by not forcing f to map every element of X to an element of Y. That means a partial function works properly only for some input values. If the function is called with a disallowed input value, it will typically throw an exception. - -The following method `divide` is a partial function that only accepts non-zero divisors. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=partialDivideFunction] ----- - -We use `lift` to turn `divide` into a total function that is defined for all inputs. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=liftedDivideFunction] ----- - -<1> A lifted function returns `None` instead of throwing an exception, if the function is invoked with disallowed input values. -<2> A lifted function returns `Some`, if the function is invoked with allowed input values. - -The following method `sum` is a partial function that only accepts positive input values. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=partialFunctionExample] ----- -<1> The function `sum` throws an `IllegalArgumentException` for negative input values. - -We may lift the `sum` method by providing the methods reference. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=liftMethodReference] ----- -<1> The lifted function catches the `IllegalArgumentException` and maps it to `None`. - -==== Partial application -Partial application allows you to derive a new function from an existing one by fixing some values. You can fix one or more parameters, and the number of fixed parameters defines the arity of the new function such that `new arity = (original arity - fixed parameters)`. The parameters are bound from left to right. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=partialApplicationFunction] ----- -<1> The first parameter `a` is fixed to the value 2. - -This can be demonstrated by fixing the first three parameters of a `Function5`, resulting in a `Function2`. -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=partialApplicationFunctionArity5] ----- -<1> The `a`, `b` and `c` parameters are fixed to the values 2, 3 and 1 respectively. - -Partial application differs from <>, as will be explored in the relevant section. - -==== Currying -Currying is a technique to partially apply a function by fixing a value for one of the parameters, resulting in a `Function1` function that returns a `Function1`. - -When a `Function2` is _curried_, the result is indistinguishable from the _partial application_ of a `Function2` because both result in a 1-arity function. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=curryingFunction] ----- -<1> The first parameter `a` is fixed to the value 2. - -You might notice that, apart from the use of `.curried()`, this code is identical to the 2-arity given example in <>. With higher-arity functions, the difference becomes clear. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=curryingFunctionArity3] ----- -<1> Note the presence of additional functions in the parameters. -<2> Further calls to `apply` returns another `Function1`, apart from the final call. - -==== Memoization -Memoization is a form of caching. A memoized function executes only once and then returns the result from a cache. -The following example calculates a random number on the first invocation and returns the cached number on the second invocation. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/FunctionsDemo.java[tags=memoizedFunction] ----- - -=== Values -In a functional setting we see a value as a kind of https://en.wikipedia.org/wiki/Normal_form_(abstract_rewriting)[normal form], an expression which cannot be further evaluated. In Java we express this by making the state of an object final and call it https://en.wikipedia.org/wiki/Immutable_object[immutable]. -Vavr's functional Value abstracts over immutable objects. Efficient write operations are added by sharing immutable memory between instances. What we get is thread-safety for free! - -==== Option -Option is a monadic container type which represents an optional value. Instances of Option are either an instance of `Some` or the `None`. - -[source,java,indent=0] ----- -// optional *value*, no more nulls -Option option = Option.of(...); ----- - -If you're coming to Vavr after using Java's `Optional` class, there is a crucial difference. In `Optional`, a call to `.map` that results in a null will result in an empty `Optional`. In Vavr, it would result in a `Some(null)` that can then lead to a `NullPointerException`. - -Using `Optional`, this scenario is valid. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/OptionDemo.java[tags=javaOptionalWithMappedNull] ----- -<1> The option is `Some("foo")` -<2> The resulting option becomes empty here - -Using Vavr's `Option`, the same scenario will result in a `NullPointerException`. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/OptionDemo.java[tags=vavrOptionWithMappedNull] ----- -<1> The option is `Some("foo")` -<2> The resulting option is `Some(null)` -<3> The call to `s.toUpperCase()` is invoked on a `null` - -This seems like Vavr's implementation is broken, but in fact it's not - rather, it adheres to the requirement of a monad to maintain computational context when calling `.map`. In terms of an `Option`, this means that calling `.map` on a `Some` will result in a `Some`, and calling `.map` on a `None` will result in a `None`. In the Java `Optional` example above, that context changed from a `Some` to a `None`. - -This may seem to make `Option` useless, but it actually forces you to pay attention to possible occurrences of `null` and deal with them accordingly instead of unknowingly accepting them. The correct way to deal with occurrences of `null` is to use `flatMap`. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/OptionDemo.java[tags=flatMapNullParameter] ----- -<1> The option is `Some("foo")` -<2> The resulting option is `Some(null)` -<3> `s`, which is `null`, becomes `None` - -Alternatively, move the `.flatMap` to be co-located with the the possibly `null` value. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/OptionDemo.java[tags=mapOptionParameter] ----- -<1> The option is `Some("foo")` -<2> The resulting option is `None` - -This is explored in more detail on the http://blog.vavr.io/the-agonizing-death-of-an-astronaut/[Vavr blog]. - -==== Try -Try is a monadic container type which represents a computation that may either result in an exception, or return a successfully computed value. It's similar to, but semantically different from `Either`. Instances of Try, are either an instance of `Success` or `Failure`. - -[source,java,indent=0] ----- -// no need to handle exceptions -Try.of(() -> bunchOfWork()).getOrElse(other); ----- - -[source,java,indent=0] ----- -import static io.vavr.API.*; // $, Case, Match -import static io.vavr.Predicates.*; // instanceOf - -A result = Try.of(this::bunchOfWork) - .recover(x -> Match(x).of( - Case($(instanceOf(Exception_1.class)), t -> somethingWithException(t)), - Case($(instanceOf(Exception_2.class)), t -> somethingWithException(t)), - Case($(instanceOf(Exception_n.class)), t -> somethingWithException(t)) - )) - .getOrElse(other); ----- - -==== Lazy -Lazy is a monadic container type which represents a lazy evaluated value. Compared to a Supplier, Lazy is memoizing, i.e. it evaluates only once and therefore is referentially transparent. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/LazyDemo.java[tags=createLazy] ----- - -You may also create a real lazy value (works only with interfaces): - -[source,java,indent=0] ----- -CharSequence chars = Lazy.val(() -> "Yay!", CharSequence.class); ----- - -==== Either -Either represents a value of two possible types. An Either is either a Left or a Right. If the given Either is a Right and projected to a Left, the Left operations have no effect on the Right value. If the given Either is a Left and projected to a Right, the Right operations have no effect on the Left value. If a Left is projected to a Left or a Right is projected to a Right, the operations have an effect. - -Example: A compute() function, which results either in an Integer value (in the case of success) or in an error message of type String (in the case of failure). By convention the success case is Right and the failure is Left. - -[source,java,indent=0] ----- -Either value = compute().right().map(i -> i * 2).toEither(); ----- - -If the result of compute() is Right(1), the value is Right(2). -If the result of compute() is Left("error"), the value is Left("error"). - -==== Future -A Future is a computation result that becomes available at some point. All operations provided are non-blocking. The underlying ExecutorService is used to execute asynchronous handlers, e.g. via onComplete(...). - -A Future has two states: pending and completed. - -*Pending:* The computation is ongoing. Only a pending future may be completed or cancelled. - -*Completed:* The computation finished successfully with a result, failed with an exception or was cancelled. - -Callbacks may be registered on a Future at each point of time. These actions are performed as soon as the Future is completed. An action which is registered on a completed Future is immediately performed. The action may run on a separate Thread, depending on the underlying ExecutorService. Actions which are registered on a cancelled Future are performed with the failed result. - -[source,java,indent=0] ----- -// future *value*, result of an async calculation -Future future = Future.of(...); ----- - -==== Validation -The Validation control is an _applicative functor_ and facilitates accumulating errors. When trying to compose Monads, the combination process will short circuit at the first encountered error. But 'Validation' will continue processing the combining functions, accumulating all errors. This is especially useful when doing validation of multiple fields, say a web form, and you want to know all errors encountered, instead of one at a time. - -Example: We get the fields 'name' and 'age' from a web form and want to create either a valid Person instance, or return the list of validation errors. - -[source,java,indent=0] ----- -include::../../../test/java/io/vavr/ValidationDemo.java[tags=validatePerson] ----- - -A valid value is contained in a `Validation.Valid` instance, a list of validation errors is contained in a `Validation.Invalid` instance. - -The following validator is used to combine different validation results to one `Validation` instance. - ----- -include::../../../test/java/io/vavr/ValidationDemo.java[tags=personValidator] ----- - -If the validation succeeds, i.e. the input data is valid, then an instance of `Person` is created of the given fields `name` and `age`. - ----- -include::../../../test/java/io/vavr/ValidationDemo.java[tags=person] ----- - -=== Collections - -Much effort has been put into designing an all-new collection library for Java which meets the requirements of functional programming, namely immutability. - -Java's Stream lifts a computation to a different layer and links to a specific collection in another explicit step. With Vavr we don't need all this additional boilerplate. - -The new collections are based on http://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html[java.lang.Iterable], so they leverage the sugared iteration style. - -[source,java] ----- -// 1000 random numbers -for (double random : Stream.continually(Math::random).take(1000)) { - ... -} ----- - -`TraversableOnce` has a huge amount of useful functions to operate on the collection. Its API is similar to http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html[java.util.stream.Stream] but more mature. - -==== List - -Vavr's `List` is an immutable linked list. Mutations create new instances. Most operations are performed in linear time. Consequent operations are executed one by one. - -===== Java 8 - -[source,java] ----- -Arrays.asList(1, 2, 3).stream().reduce((i, j) -> i + j); ----- - -[source,java] ----- -IntStream.of(1, 2, 3).sum(); ----- - -===== Vavr - -[source,java] ----- -// io.vavr.collection.List -List.of(1, 2, 3).sum(); ----- - -==== Stream - -The `io.vavr.collection.Stream` implementation is a lazy linked list. Values are computed only when needed. Because of its laziness, most operations are performed in constant time. Operations are intermediate in general and executed in a single pass. - -The stunning thing about streams is that we can use them to represent sequences that are (theoretically) infinitely long. - -[source,java] ----- -// 2, 4, 6, ... -Stream.from(1).filter(i -> i % 2 == 0); ----- - -==== Performance Characteristics - -.Time Complexity of Sequential Operations -[width="100%",frame="topbot",options="header"] -|==================================================================================================== -| | head() | tail() | get(int) | update(int, T) | prepend(T) | append(T) -| Array | const | linear | const | const | linear | linear -| CharSeq | const | linear | const | linear | linear | linear -| Iterator | const | const | — | — | — | — -| List | const | const | linear | linear | const | linear -| Queue | const | const^a^ | linear | linear | const | const -| PriorityQueue | log | log | — | — | log | log -| Stream | const | const | linear | linear | const^lazy^ | const^lazy^ -| Vector | const^eff^ | const^eff^ | const ^eff^ | const ^eff^ | const ^eff^ | const ^eff^ -|==================================================================================================== - -.Time Complexity of Map/Set Operations -[width="100%",frame="topbot",options="header"] -|================================================================= -| | contains/Key | add/put | remove | min -| HashMap | const^eff^ | const^eff^ | const^eff^ | linear -| HashSet | const^eff^ | const^eff^ | const^eff^ | linear -| LinkedHashMap | const^eff^ | linear | linear | linear -| LinkedHashSet | const^eff^ | linear | linear | linear -| Tree   | log | log | log | log -| TreeMap | log | log | log | log -| TreeSet | log | log | log | log -|================================================================= - -Legend: - -* const — constant time -* const^a^ — amortized constant time, few operations may take longer -* const^eff^ — effectively constant time, depending on assumptions like distribution of hash keys -* const^lazy^ — lazy constant time, the operation is deferred -* log — logarithmic time -* linear — linear time - -=== Property Checking - -Property checking (also known as http://en.wikipedia.org/wiki/Property_testing[property testing]) is a truly powerful way to test properties of our code in a functional way. It is based on generated random data, which is passed to a user defined check function. - -Vavr has property testing support in its `io.vavr:vavr-test` module, so make sure to include that in order to use it in your tests. - -[source,java] ----- -Arbitrary ints = Arbitrary.integer(); - -// square(int) >= 0: OK, passed 1000 tests. -Property.def("square(int) >= 0") - .forAll(ints) - .suchThat(i -> i * i >= 0) - .check() - .assertIsSatisfied(); ----- - -Generators of complex data structures are composed of simple generators. From 7f9cc4b982168cf0bf19e48c0a3144012c8399f8 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 6 Dec 2024 18:24:49 +0100 Subject: [PATCH 5/5] Attribution --- src/docs/asciidoc/es/index.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/docs/asciidoc/es/index.adoc b/src/docs/asciidoc/es/index.adoc index 30b7655..b423293 100644 --- a/src/docs/asciidoc/es/index.adoc +++ b/src/docs/asciidoc/es/index.adoc @@ -1,5 +1,6 @@ = Guía del usuario de Vavr -Daniel Dietrich, Robert Winkler +Daniel Dietrich, Robert Winkler, Grzegorz Piwowarek +translation: traducido por Geovanny Mendoza :toc: left :toclevels: 3 :source-highlighter: coderay