为什么我的流调用无法链接

时间:2018-05-08 08:32:36

标签: java lambda java-stream

我有一个功能:

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 :(得分:0)

试试这个(假设只有一对一的映射)。

但我建议你使用Map&lt;&gt;作为返回类型。

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));
}

答案 1 :(得分:0)

看起来像你想要的(如果你想要一个 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)); } 作为返回类型),但这假设该值数组将具有单个值

 <img src="smiley.gif" srcset="alternatve.gif" width="32" height="32" />