Skip to content

Instantly share code, notes, and snippets.

@henri-tremblay
Last active August 29, 2015 14:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save henri-tremblay/ecfda175a82abbc26040 to your computer and use it in GitHub Desktop.
Save henri-tremblay/ecfda175a82abbc26040 to your computer and use it in GitHub Desktop.
What is the real functional way?
private Map<String, List<String>> mapHeaders(Header[] headers) {
Map<String, List<String>> headerMap = new HashMap<>();
Arrays.stream(headers)
.forEach(h -> {
List<String> values = headerMap.get(h.getName());
if(values == null) {
values = new ArrayList<String>();
headerMap.put(h.getName(), values);
}
values.add(h.getValue());
});
return headerMap;
}
// slightly improved version. But I still have the forEach
private Map<String, List<String>> mapHeaders(Header[] headers) {
Map<String, List<String>> headerMap = new HashMap<>();
Arrays.stream(headers)
.forEach(h -> {
headerMap.computeIfAbsent(h.getName(), k -> new ArrayList<>()).add(h.getValue());
});
return headerMap;
}
// The answer!
private Map<String, List<String>> mapHeaders(Header[] headers) {
Map<String, List<String>> headerMap = Arrays.stream(headers)
.collect(Collectors.groupingBy(Header::getName, Collectors.mapping(Header::getValue, Collectors.toList())));
return headerMap;
}
@seblm
Copy link

seblm commented May 21, 2015

With static imports and inlining:

// The answer!
private Map<String, List<String>> mapHeaders(Header[] headers) {
    return stream(headers).collect(groupingBy(Header::getName, mapping(Header::getValue, toList())));
}

Could be more readable.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment