Как исправить двусмысленный тип на ссылке метода (toString целого)?

24

При этом

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

Я получаю ошибку неоднозначного типа. Понятно, что компилятор не может сказать, имею ли я toString(int) или toString() из Integer .

Если вы не используете ссылку на метод, я мог бы выйти из этого с явным приложением или выписать длинную руку generics, , но как я могу сообщить компилятору, что я имею в виду здесь ? Какой синтаксис (если таковой имеется) можно использовать для однозначного?     

задан Toby 19.02.2014 в 08:28
источник
  • Вы пытались изменить карту на mapToInt? –  chillworld 19.02.2014 в 08:43

3 ответа

30

Невозможно сделать однозначные ссылки на методы; просто сказано, ссылки на методы - это функция, которая поддерживается только для однозначных ссылок на методы. Итак, у вас есть два решения:

  1. используйте выражение лямбда:

    Stream.of(1, 32, 12, 15, 23).map(i->Integer.toString(i));
    
  2. (желательно, по крайней мере, мной) Используйте поток примитивных значений int , когда источник состоит только из примитивных значений int :

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

    Это будет использовать статический метод Integer.toString(int) для потребления значений int .

ответ дан Holger 19.02.2014 в 10:25
источник
15

Ваши основные параметры, используя ссылки на методы, следующие:

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

Ваша текущая версия может означать i -> i.toString() или i -> Integer.toString(i) .

    
ответ дан assylias 19.02.2014 в 11:02
источник
13

Так как Integer.toString() переопределяет Object.toString() , в этом конкретном случае вы можете исправить это следующим образом:

Stream.of(1, 32, 12, 15, 23).map(Object::toString);
    
ответ дан SlavaSt 25.07.2016 в 09:13
источник