Hier ist meine Lösung mit reduzieren. y Optional :
private Optional<SimpleImmutableEntry<String, String>> splitKeyValue(String text) {
String[] v = text.split("=");
if (v.length == 1 || v.length == 2) {
String key = URLDecoder.decode(v[0], StandardCharsets.UTF_8);
String value = v.length == 2 ? URLDecoder.decode(v[1], StandardCharsets.UTF_8) : null;
return Optional.of(new SimpleImmutableEntry<String, String>(key, value));
} else
return Optional.empty();
}
private HashMap<String, String> parseQuery(URI uri) {
HashMap<String, String> params = Arrays.stream(uri.getQuery()
.split("&"))
.map(this::splitKeyValue)
.filter(Optional::isPresent)
.map(Optional::get)
.reduce(
// initial value
new HashMap<String, String>(),
// accumulator
(map, kv) -> {
map.put(kv.getKey(), kv.getValue());
return map;
},
// combiner
(a, b) -> {
a.putAll(b);
return a;
});
return params;
}
- Ich ignoriere doppelte Parameter (ich nehme den letzten).
- Ich benutze
Optional<SimpleImmutableEntry<String, String>>
um später Müll zu ignorieren
- Die Reduktion beginnt mit einer leeren Karte und füllt sie dann bei jedem SimpleImmutableEntry
Falls Sie fragen, reduzieren. erfordert diesen seltsamen Kombinierer im letzten Parameter, der nur in parallelen Streams verwendet wird. Sein Ziel ist die Zusammenführung zweier Zwischenergebnisse (hier HashMap).