¿Cómo arreglar el tipo ambiguo en la referencia del método (toString of an Integer)?

Al hacer esto

Stream.of(1, 32, 12, 15, 23).map(Integer::toString); 

Obtengo un error de tipo ambiguo. Es comprensible que el comstackdor no pueda decir si me refiero a toString(int) o toString() desde Integer .

Cuando no utilizo una referencia de método, podría haber salido de esto con un molde explícito o escribir la mano larga de generics, pero ¿cómo puedo dejar que el comstackdor sepa lo que quiero decir aquí ? ¿Qué syntax (si hay alguna) puedo usar para hacer inequívoca?

No hay forma de hacer que las referencias a los métodos sean inequívocas; simplemente dicho, las referencias de método son una característica que solo se admite para referencias de método inequívocas. Entonces tienes dos soluciones:

  1. usa una expresión lambda:

     Stream.of(1, 32, 12, 15, 23).map(i->Integer.toString(i)); 
  2. (Preferido, al menos por mí) Utilice una secuencia de valores primitivos int cuando la fuente consta únicamente de valores int primitivos:

     IntStream.of(1, 32, 12, 15, 23).mapToObj(Integer::toString); 

    Esto usará el método estático Integer.toString(int) para consumir los valores int .

Sus principales opciones, utilizando referencias de métodos, son:

 Stream.of(1, 32, 12, 15, 23).map(String::valueOf); IntStream.of(1, 32, 12, 15, 23).mapToObj(Integer::toString); 

Su versión actual podría significar i -> i.toString() o i -> Integer.toString(i) .

Dado que Integer.toString() anula Object.toString() , en este caso particular puede corregirlo de la siguiente manera:

 Stream.of(1, 32, 12, 15, 23).map(Object::toString);