Почему мой поток вызовов не может быть связан - PullRequest
0 голосов
/ 08 мая 2018

У меня есть функция:

private HashMap<String,String> getProperties(HttpServletRequest request) {
    Stream<Map.Entry<String,String>> s = request.getParameterMap().entrySet().stream();
    return s.collect(HashMap::new, (map, e)->map.put(e.getKey(), e.getValue()), HashMap::putAll);
}

Она отлично работает, но вначале я однажды пытался связать ее вместе, как это делают большинство программистов на Java 8:

private HashMap<String,String> getProperties(HttpServletRequest request) {
    return request.getParameterMap().entrySet().stream().collect(HashMap::new, (map, e)->map.put(e.getKey(), e.getValue()), HashMap::putAll);
}

Произошли ошибки компиляции, кто-нибудь может объяснить это?и есть ли способ обойти все вызовы?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Похоже, что вы хотите (в случае, если вы хотите Map в качестве возвращаемого типа), но это предполагает, что этот массив значений будет иметь одно значение

 private static HashMap<String, String> getProperties(HttpServletRequest request) {
    return request.getParameterMap()
            .entrySet()
            .stream()
            .collect(Collectors.toMap(
                    Entry::getKey,
                    e -> e.getValue()[0],
                    (left, right) -> {
                        throw new AssertionError("more than two entries in the array");
                    },
                    HashMap::new));
}
0 голосов
/ 08 мая 2018

Попробуйте это (допустим только однозначное сопоставление).

Но я рекомендую вам использовать Map <> в качестве типа возвращаемого значения.

private HashMap<String,String> getProperties(HttpServletRequest request) {
    return request.getParameterMap().entrySet().stream()
                 .filter(e -> e.getValue() != null && e.getValue().length > 0)
                 .map(e -> new SimpleEntry<>(e.getKey(), e.getValue()[0])) // This is part where you are sure that only one-to-one parameter value
                 .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v2, HashMap::new));
}
...