style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Java Magic Box

Y siempre si se pudo, me costo mas trabajo del que pensaba, pero pude escribir la version de la Caja que en Javascript me parece muy simple en Kotlin parece que estoy escribiendo marciano y en Java, pues ni se diga, la verdad es que no parece java :P, pero lo importante y tal vez me haga regresar a escribir java, es que el soporte funcional es bueno (obvio no es un lenguaje puramente funcional, si no, se me enojan los clojurianos).

Pero si puedo escribir codigo como este, para servicios REST y otras moneria ya me imagino las posibilidades, bueno les dejo el codigo:

import java.util.function.Function;

class Box<T>  {

    private T x;

    public Box(T x) {
        this.x = x;
    }

    <R> Box<R> map(Function<T, R> f) {
        return new Box(f.apply(this.x));
    }

    <R> R fold(Function<T, R> f) {
        return f.apply(this.x);
    }

    public String toString() {
        return "Box(" + this.x != null ? x.toString() : x + ")";
    }

}

public class Main {

    public static void main(String... args) {

        Box<Integer> num = new Box<String>("  64  ")
                .map(x -> x.trim())
                .map(x -> Integer.valueOf(x));

        System.out.println(num);

        System.out.println((String)num.fold(x -> Character.toString((char) x.intValue())));

    }
}

Eso va en cualquier archivo java y lo ejecutamos en cualquier IDE o consola. La salida es exactamente la misma:

Box(64)
@

Nota importante: para java es importante tener mas cuidado con la definicion de las variables y los tipos, creamos una Caja String pero el resultado es Integer por lo que debemos guardar la caja en una Caja Integer. Esto me dio algunos dolores de cabeza para arreglar, pero comparando el codigo no esta tan mal a mi parecer.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

inferencia de tipos

Deja que la inferencia de tipos te ayude para que no escribas tanto código, y no se afecta la legibilidad para nada.

Y de paso, utiliza los estándares: toString en vez de inspect, por ejemplo, o referencias a métodos en donde se pueda:

import java.util.function.Function;
class Box<T>  {

    private final T x;

    public Box(T x) {
        this.x = x;
    }

    <R> Box<R> map(Function<T, R> f) {
        return new Box<R>(f.apply(x));
    }

    <R> R fold(Function<T, R> f) {
        return f.apply(x);
    }

    public String toString() {
        return "Box(" + x + ")";
    }

}

public class Main {

    public static void main(String... args) {

        Box<Integer> num = new Box<>("  64  ")
                .map(x -> x.trim())
                .map(Integer::valueOf);

        System.out.println(num);

        System.out.println((String)num.fold(x -> Character.toString((char) x.intValue())));

    }
}

Post actualizado

Gracias por las observaciones

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">