Справочник по методам для списка целых типов - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть код, подобный приведенному ниже.

List<Integer> parameters = ...

String string = " NOT IN (" + 
    parameters.stream()
              .map(parameter -> parameter.toString())
              .collect(Collectors.joining(",")) 
+ ") ";

Я хочу преобразовать лямбда-выражение параметра -> parameter.toString () в ссылку на метод.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Поскольку parameters равно List<Integer>, вам, вероятно, понадобится:

parameters.stream().map(i -> i.toString()).collect(Collectors.joining(","));

Проблема

Однако использование эталонного метода немного проблематично, посколькуInteger определил три метода с именем toString:

  • toString(), который возвращает объект String, представляющий значение этого целого числа.
  • static toString(int i), который возвращает объект String, представляющий указанное целое число.
  • static toString(int i, int radix), который возвращает строковое представление первого аргумента в основании, заданном вторым аргументом.

Таким образом, использование ссылки на метод, как показано ниже, приведет к:

parameters.stream().map(Integer::toString).collect(Collectors.joining(","));

Неоднозначная ссылка на метод: и toString (), и toString (int) из типа Integer являютсяправомочный

Решение

В этом случае вы можете использовать класс Number, который является родительским для Integer и его метод Number::toString, который делает то же самое:

parameters.stream().map(Number::toString).collect(Collectors.joining(","));
0 голосов
/ 28 сентября 2018

Используйте это:

List<Integer> parameters = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

    String string = parameters.stream()
            .map(Object::toString)
            .collect(Collectors.joining(", ", " NOT IN (", ") "));
System.out.println(string);

Это не обязательно для конкатата String, Collectors.joining сделать это за вас.

Результат:

NOT IN (1, 2, 3, 4, 5, 6, 7, 8)
0 голосов
/ 27 сентября 2018

Просто определите метод toString в вашем классе, скажем Parameter, и вы можете использовать его как ссылку на метод в потоках:

parameters.stream().map(Parameter::toString).collect(Collectors.joining(",")) 

Если у вас нет определенного класса, и вы используете Integer тип для списка, просто используйте Object::toString напрямую, как предложено коллегами в комментариях.

Мой ответ предназначен для охвата общего случая, то есть того, который обрабатывает определенный пользователемзанятия с любым методом.

...