Использование коллекторов с присоединяющимся символьным разделителем

Я создаю параметр запроса под названием "id", это список, поэтому у меня есть что-то вроде localhost:8080/application?id=1&id=2&id=3&id=4

(Я знаю, что моего метода недостаточно, и мне нужно написать первый ?id=)

Метод

public Map<Long, String> getSkus(List<ItemPedido> itensPedido) {
    Map<Long, String> skus = new HashMap<>();
    String ids = itensPedido.stream()
            .filter(i -> i.getProduto() != null)
            .map(i -> i.getProduto().getId())
            .collect(Collectors.joining("&id="));
    //TODO 
    return skus;
}

Мой вопрос: почему я получил эту ошибку в Collectors.joining("&id=")?

no suitable method found for collect(java.util.stream.Collector<java.lang.CharSequence,capture#1 of ?,java.lang.String>)
[ERROR]     method java.util.stream.Stream.<R>collect(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,? super java.lang.Long>,java.util.function.BiConsumer<R,R>) is not applicable
[ERROR]       (cannot infer type-variable(s) R
[ERROR]         (actual and formal argument lists differ in length))
[ERROR]     method java.util.stream.Stream.<R,A>collect(java.util.stream.Collector<? super java.lang.Long,A,R>) is not applicable
[ERROR]       (cannot infer type-variable(s) R,A
[ERROR]         (argument mismatch; java.util.stream.Collector<java.lang.CharSequence,capture#1 of ?,java.lang.String> cannot be converted to java.util.stream.Collector<? super java.lang.Long,A,R>))

Я использую OpenJDK

$ java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

person Daniela Morais    schedule 07.05.2018    source источник
comment
Какой тип getId() от getProduto() (от ItemPedido)? Я собираюсь угадать не String.   -  person Elliott Frisch    schedule 07.05.2018
comment
попробуйте .map(i -> i.getProduto().getId().ToString()), предполагая, что getId() возвращает Long.   -  person Ousmane D.    schedule 07.05.2018
comment
@ElliottFrisch Вот оно! Спасибо   -  person Daniela Morais    schedule 07.05.2018
comment
Рассмотрим .map("id="::concat).collect(Collectors.joining("&", "?", ""))   -  person shmosel    schedule 07.05.2018
comment
@ElliottFrisch технически говоря, подойдет любой тип CharSequence, а не только String.   -  person Ousmane D.    schedule 07.05.2018
comment
@Aominè Достаточно честно. Вероятно, это не CharSequence либо.   -  person Elliott Frisch    schedule 07.05.2018


Ответы (1)


Сопоставьте свой поток с потоком строк:

.map(i -> i.getProduto().getId().toString())
person Krzysztof Kaszkowiak    schedule 07.05.2018