Las clases en Kotlin pueden tener propiedades. Se pueden declarar como mutables, usando la palabra clave var o de solo lectura usando la palabra clave val.
class Address {
var name: String = ...
var street: String = ...
var city: String = ...
var state: String? = ...
var zip: String = ...
}
Para usar una propiedad, simplemente nos referimos a ella por su nombre, como si fuera un campo en Java:
fun copyAddress(address: Address): Address {
val result = Address() // there's no 'new' keyword in Kotlin
result.name = address.name // accessors are called
result.street = address.street
// ...
return result
}
La sintaxis completa para declarar una propiedad es
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
El inicializador, getter y setter son opcionales. El tipo de propiedad es opcional si se puede inferir del inicializador (o del tipo de devolución del captador, como se muestra a continuación).
Ejemplos:
var allByDefault: Int? // error: explicit initializer required, default getter and setter implied
var initialized = 1 // has type Int, default getter and setter
La sintaxis completa de una declaración de propiedad de solo lectura difiere de la mutable en dos formas: comienza con val en lugar de var y no permite un definidor:
val simple: Int? // has type Int, default getter, must be initialized in constructor
val inferredType = 1 // has type Int and a default getter
Podemos definir accesores personalizados para una propiedad. Si definimos un captador personalizado, se llamará cada vez que accedamos a la propiedad (esto nos permite implementar una propiedad computada). Aquí hay un ejemplo de un captador personalizado:
val isEmpty: Boolean
get() = this.size == 0
Si definimos un configurador personalizado, se llamará cada vez que asignemos un valor a la propiedad. Un setter personalizado se ve así:
var stringRepresentation: String
get() = this.toString()
set(value) {
setDataFromString(value) // parses the string and assigns values to other properties
}
Por convención, el nombre del parámetro de establecimiento es valor, pero puede elegir un nombre diferente si lo prefiere.
Desde Kotlin 1.1, puede omitir el tipo de propiedad si se puede deducir del captador:
val isEmpty get() = this.size == 0 // has type Boolean
Si necesita cambiar la visibilidad de un elemento de acceso o anotarlo, pero no necesita cambiar la implementación predeterminada, puede definir el elemento de acceso sin definir su cuerpo:
var setterVisibility: String = "abc"
private set // the setter is private and has the default implementation
var setterWithAnnotation: Any? = null
@Inject set // annotate the setter with Inject
Seguiremos en otro post, por lo pronto dejo link:
https://kotlinlang.org/docs/reference/properties.html
Translate
jueves, 17 de enero de 2019
martes, 15 de enero de 2019
NoSQL Performance Benchmark 2018
Me llego esta mail de la gente de Couchbase :
Si está pensando en cambiar a una base de datos NoSQL, es importante pensar con anticipación. Una opción popular como MongoDB ™ podría funcionar ahora para sus aplicaciones NoSQL a pequeña escala. Pero cuando llega el momento de escalar, las cosas pueden complicarse muy rápidamente.
Lee el NoSQL Performance Benchmark 2018 de Altoros para descubrir cómo Couchbase:
- Supera constantemente a MongoDB ™ y DataStax
- Maneja fácilmente diferentes configuraciones y cargas de trabajo masivas
- Ofrece una agilidad, flexibilidad y rendimiento inigualables en cualquier escala
- Obtendrá un análisis en profundidad del rendimiento de Couchbase, MongoDB ™ y DataStax en 3 configuraciones de clúster diferentes y 4 cargas de trabajo diferentes utilizando el Yahoo Cloud Serving Benchmark.
Dejo link: https://resources.couchbase.com/c/altoros-nosql-performance-benchmark?x=N-I_ik&mkt_tok=eyJpIjoiTVROalpqQTBNRFV3WVdVdyIsInQiOiJRbWxoWGdEMUd3M1dCVW5EeVhTXC9ZbkkwMmRnb2xXWnNLd3g4cjVCM3JIbktVK0JScENpU2pXWVJONmNqRVBzWFVtbHh3YkRsNHZPOXgrNzd2NUZjWThtRHUxamVGK3ArU0d2SjdvMTdDSG54NHQ1YUhTVTNXeU94TlwvNmY4SlpXIn0%3D
domingo, 13 de enero de 2019
Ubuntu Budgie
Pero mi otro problema fue Ubuntu 18.10, con el cual tuve muchos problemas:
- Lo instale y tiraba un error todo el tiempo haciendo que el disco se llene rápidamente.
- No funciono samba.
- Se cuelga o congela cada tanto, no se si sera un problema de drivers o que.
En fin, mi conclusión es que le falta unos minutos de horno o horas. No esta 100% listo, pero voy a ser tester y lo voy a seguir usando. Si me canso creo que voy a elegir otra distro.
Cual me aconsejan?
miércoles, 9 de enero de 2019
Más eBooks de java code geeks
domingo, 6 de enero de 2019
Que es la Arquitectura hexagonal?
La arquitectura hexagonal es un estilo que habla sobre la organización en capas de una manera que aísla su lógica central de elementos externos.
La capa central es la de lógica del negocio, y los elementos externos son como puntos de integración, por ejemplo, DBs, APIs externas, UIs, y otros. Divide el software en las partes internas y externas. Las partes internas contienen la lógica empresarial principal y la capa de dominio. La parte exterior consta de IU, base de datos, mensajería y otras cosas. Las partes internas y externas se comunican entre sí mediante puertos y adaptadores.
Para resumir, la arquitectura hexagonal es un enfoque utilizado para dividir la aplicación en partes internas y externas. Están conectados a través de puertos (expuestos por el interior) y adaptadores (implementados por el exterior). Por lo tanto, al aplicar este enfoque, el código de caso de uso central permanece intacto y puede servir para múltiples canales, soportando diferentes protocolos. También ayuda a hacer la aplicación fácil de probar. Tampoco esta bien implementar todas las funcionalidades de esta manera deberíamos ser selectivos.
Si me permiten una opinion, no veo mayor innovación en esto, es un nombre bonito para un estilo arquitectónico que venimos utilizando hace tiempo.
Nuevos cursos de MongoDB University
Me llego el siguiente mail promocionando cursos de mongodb y la noticia de nuevos cursos:
|
sábado, 5 de enero de 2019
Las 10 mejores distros livianas para este año 2019
Leí este post y me resulto muy interesante hacer un post sobre distros linux livianas, no solo porque cuando desarrollamos necesitamos mucho hardware y una ditro liviana puede ser de gran ayuda, sino tambien porque esta buenisimo empezar con una distro liviana y básica y a medida que se va utilizando poder agregarle cosas. Terminas teniendo un sistema super personalizado y eficiente.
- Bodhi Linux
- Puppy Linux
- Linux Lite
- Ubuntu MATE
- Lubuntu
- Arch Linux + Lightweight Desktop environment
- LXLE
- Peppermint OS
- antiX
- Manjaro Linux Xfce Edition
Dejo link: https://maslinux.es/las-10-mejores-distros-livianas-para-este-ano-2019/
miércoles, 2 de enero de 2019
3 libros gratuitos de AWS Lambda, cybersecurity y React
|
lunes, 31 de diciembre de 2018
Minilibros gratuitos.
Quiero compartir estos 2 libros gratuitos de Java Code Geeks :
Download Minibooks!
|
|
jueves, 27 de diciembre de 2018
The Hundred-Page Machine Learning Book
Podemos bajarnos el libro "The Hundred-Page Machine Learning Book" la versión draf hasta que sea publicado.
Sin más dejo el link: http://themlbook.com/wiki/doku.php
lunes, 24 de diciembre de 2018
Feliz Navidad!!
Desde el blog queremos desearle una muy Feliz Navidad!!!
nano navidad.sh
#!/bin/bash
trap "tput reset; tput cnorm; exit" 2
clear
tput civis
lin=2
col=$(($(tput cols) / 2))
c=$((col-1))
est=$((c-2))
color=0
tput setaf 2; tput bold
# Tree
for ((i=1; i<20; i+=2))
{
tput cup $lin $col
for ((j=1; j<=i; j++))
{
echo -n \*
}
let lin++
let col--
}
tput sgr0; tput setaf 3
# Trunk
for ((i=1; i<=2; i++))
{
tput cup $((lin++)) $c
echo 'mWm'
}
new_year=$(date +'%Y')
let new_year++
tput setaf 1; tput bold
tput cup $lin $((c - 6)); echo FELICES FIESTAS
tput cup $((lin + 1)) $((c - 9)); echo Y mucho CODIGO en $new_year
let c++
k=1
# Lights and decorations
while true; do
for ((i=1; i<=35; i++)) {
# Turn off the lights
[ $k -gt 1 ] && {
tput setaf 2; tput bold
tput cup ${line[$[k-1]$i]} {column[$[k-1]$i]}; echo \*
unset line[$[k-1]$i]; unset column[$[k-1]$i] # Array cleanup
}
li=$((RANDOM % 9 + 3))
start=$((c-li+2))
co=$((RANDOM % (li-2) * 2 + 1 + start))
tput setaf $color; tput bold # Switch colors
tput cup $li $co
echo o
line[$k$i]=$li
column[$k$i]=$co
color=$(((color+1)%8))
# Flashing text
sh=1
for l in C O D I G O
do
tput cup $((lin+1)) $((c-3+sh))
echo $l
let sh++
sleep 0.01
done
}
k=$((k % 2 + 1))
done
Y ahora ejecutamos:
bash navidad.sh
domingo, 23 de diciembre de 2018
Operaciones comunes con collections en Kotlin
Vamos a revisar el conjunto de funciones que tiene kotlin para manejo de colecciones:
Vamos a empezar con 'filter'. Éste filtra el contenido de la lista y mantiene solo los elementos que satisfacen el predicado. Por ejemplo, aquí tenemos el predicado que comprueba que un número es par, y solo los números pares están presentes en la lista resultante.
val originalList = listOf(1, 2, 3, 4, 5, 6)
assertEquals(listOf(2, 4, 6), originalList.filter { it % 2 == 0 })
La función map() transforma una colección en una nueva, y transforma cada elemento en esta colección. Por ejemplo, aquí encontramos un cuadrado de cada número dado y la colección resultante es una colección de cuadrados. Tenga en cuenta que la colección resultante contiene tantos elementos como el primero.
val nums = listOf(1, 2, 3, 4, 5, 6)
val nums2 = nums.map { e -> e * 2 }
println(nums2)
Hay varios predicados que verifican si los hechos dados son verdaderos para los elementos. Por ejemplo, 'any' comprueba que hay al menos un elemento que satisface el predicado dado. all verifica si todos los elementos satisfacen el predicado, y none comprueba que ninguno de los elementos satisface el predicado dado.
val nums = listOf(4, 5, 3, 2, -1, 7, 6, 8, 9)
val r = nums.any { e -> e > 10 }
if (r) println("There is a value greater than ten")
else println("There is no value greater than ten")
r = nums.all { e -> e > 0 }
if (r) println("nums list contains only positive values")
else println("nums list does not contain only positive values")
r = nums.none { e -> e > 0 }
if (!r) println("nums list contains only positive values")
else println("nums list does not contain only positive values")
find() encuentra un elemento que satisface el predicado dado y lo devuelve como resultado. Si no hay ningún elemento (obligatorio) que devuelve null.
firstOrNull() busca el primer elemento te devuelve un elemento o 'null' como resultado. Mientras que first() solo toma un predicado y lanza una excepción si no hay tal elemento
val originalList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = originalList.firstOrNull { it > 4 }
assertEquals(result, 5)
count() cuenta el número de elementos que satisfacen el predicado dado. max retorna el máximo, min el mínimo:
val nums = listOf(11, 5, 3, 8, 1, 9, 6, 2)
val len = nums.count()
val max = nums.max()
val min = nums.min()
val msg = """
max: $max, min: $min,
count: $len
"""
println(msg.trimIndent())
partition divide la colección en dos (colecciones) los que cumplen o no un predicado.
val nums = listOf(4, -5, 3, 2, -1, 7, -6, 8, 9)
val (nums2, nums3) = nums.partition { e -> e < 0 }
println(nums2)
println(nums3)
Si desea dividir la colección en varios grupos por clave dada, puede usar groupBy utilizando como argumento la forma de agrupar los elementos, cuál debería ser la clave. Por ejemplo
val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8)
val res = nums.groupBy { if (it % 2 == 0) "even" else "odd" }
println(res)
AssociateBy también realiza la agrupación, pero devuelve un elemento como el valor del mapa. AssociateBy debe usarse solo si la clave es única. Si no es así, se eliminan los duplicados. De esta forma nos quedamos con el ultimo.
val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8)
nums.associate { (if (it % 2 == 0) "greatest_even" else "greatest_odd") to it }
Otra forma de organizar de alguna manera un par de colecciones es zip. El cual las une :
val names = listOf("Jon", "John", "Jane")
val ages = listOf(23, 32, 28)
names.zip(ages)
// [(Jon, 23), (John, 32), (Jane, 28)]
val customerMap = mapOf(Pair(Customer("Jack", 25), Address("NANTERRE CT", "77471")),
Pair(Customer("Mary", 37), Address("W NORMA ST", "77009")),
Pair(Customer("Peter", 18), Address("S NUGENT AVE", "77571")),
Pair(Customer("Amos", 23), Address("E NAVAHO TRL", "77449")),
Pair(Customer("Craig", 45), Address("AVE N", "77587")))
val customerList = customerMap.flatMap { (customer, _) -> listOf(customer) }
customerList.forEach{ println(it) }
/*
Customer(name=Jack, age=25)
Customer(name=Mary, age=37)
Customer(name=Peter, age=18)
Customer(name=Amos, age=23)
Customer(name=Craig, age=45)
*/
Y a veces tenemos una lista de solo elementos como resultado. Entonces, lo que hace la función flatten, toma una lista de listas de elementos y la aplana retorna una lista plana
val list = listOf(
listOf(1, 2, 3),
listOf("one", "two", "three"),
listOf(Customer("Jack", 25), Customer("Peter", 31), Customer("Mary", 18))
)
var flattenList = list.flatten()
println(flattenList)
/*
[1, 2, 3, one, two, three, Customer(name=Jack, age=25), Customer(name=Peter, age=31), Customer(name=Mary, age=18)]
*/
Dejo link: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/
jueves, 20 de diciembre de 2018
70 libros gratuitos de javascript.
Ya que estoy recomendado libros quiero recomendarle este sitio donde pueden bajar varios libros sobre tecnologías que se utilizan en el front-end.
Dejo link: http://on.edupioneer.net/38ae0c8df8
Libro gratuito de CouchDb, HTML 5, JAXB y JavaFx
Quiero recomendar estos Libros gratuitos:
Download Dev Guides!
|
| ||||||
|
|
Suscribirse a:
Entradas (Atom)