¿Por qué es necesario decir explícitamente una lambda se consumidor utilice el método andthen?

Petar Petrov:

Me he enfrentado a un comportamiento extraño (para mí) cuando yo estaba tratando de usar la composición de funciones con dos métodos vacíos. He escrito un ejemplo simple para ilustrar el problema:

public class Startup {

    public static void main(String[] args) {

        List<Foo> foos = new ArrayList<>();

        // 1) Does not compile
        foos.forEach(Startup::doSomething1.andThen(Startup::doSomething2));

        Consumer<Foo> doSomething1 = Startup::doSomething1;
        Consumer<Foo> doSomething2 = Startup::doSomething2;

        // 2) Works as expected 
        foos.forEach(doSomething1.andThen(doSomething2));

    }

    public static void doSomething1(Foo foo) {

    }

    public static void doSomething2(Foo foo) {

    }

    public static class Foo {

    }

}

Cuando intento compilar la primera solución que dice " ')' espera" antes de la llamada andthen.

Cuando digo esto explícitamente son consumidores se compila el código y funciona como se esperaba.

¿Puede alguien explicar a mi por qué ocurre esto y es que hay otra forma de hacer la composición de funciones de métodos vacíos con Java 8?

akortex91:

Esto tiene que ver con la forma de infiere Java, convierte y tipos Detecta en lambdas. Como se mencionó en un comentario anterior, la conversión a Consumer<Foo>no ha tenido lugar todavía lo que significa que el compilador no sabe que se trata de una Consumermanera que puede encadenar un andThen()después.

Explícitamente fundición a un Consumery el uso de paréntesis correctamente le permitirá conseguir el efecto deseado:

List<Foo> foos = new ArrayList<>();
foos.forEach(((Consumer<Foo>) Null::doSomething).andThen(Null::doSomething2));

Supongo que si el violín alrededor con ella, se puede lograr el mismo comportamiento utilizando testigos de tipo pero no estoy 100% seguro de si se puede lograr el resultado deseado.

La primera vez me di cuenta de que esto era el uso de comparadores encadenados que pueden presentar el mismo comportamiento. Haciendo una búsqueda en línea acerca de que le mostrará algunos detalles más intrincados con respecto a cómo funciona este.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=184623&siteId=1
Recomendado
Clasificación