Вот решение от ListMultimap
, либо из Google Guava или моей библиотеки Abacus-Util
ListMultimap result = Multimaps.newListMultimap(new HashMap<>(), () -> new ArrayList<>()); // by Google Guava.
// Or result = N.newListMultimap(); // By Abacus-Util
items.forEach(item -> item.getBelongsToCategories().forEach(c -> result.put(c, item)));
Я думаю, что это будет немного более эффективный и лаконичный без создания ненужных временных Entry
объектов по flatMap
.
посмотрите на класс QueryStringBuilder и его тестовый класс:
private String httpBuildQuery(Map<String, String> data)
throws UnsupportedEncodingException {
QueryStringBuilder builder = new QueryStringBuilder();
for (Entry<String, String> pair : data.entrySet()) {
builder.addQueryParameter(pair.getKey(), pair.getValue());
}
return builder.encode("UTF-8");
}
Вы, вероятно, хотели бы проверить "Принять" заголовок запроса на кодировку, поддерживаемую клиентом прежде, чем вызвать UTF-8 (даже при том, что это - вероятно, лучший выбор).
Взгляды хорошо, с этими протестами:
Map<String, String>
вместо того, чтобы бросать ключ и значение для Строкового представления.Править: Кажется, что я был неправ относительно кодирования; HTTP ДОБИРАЕТСЯ, параметры не подвергаются заголовку кодирования и традиционно не имели четко определенного кодирования вообще. RFC 3988 действительно кажется мандату UTF-8, но это звучит довольно хрупким мне, поэтому если Вы не имеете жесткий контроль над сервером и можете удостовериться, что он действительно использует UTF-8 также, я использовал бы запросы POST на любые данные, это не находится в диапазоне ASCII на 7 битов.