ラムダ式が導入されて(java8)結構たちましたが、
あまりやる気がしなかったが、
重い腰を上げて、おれおれフレームワークに少しづつ適用中。
いろいろ例はあるが、やはりコレクションには適用しやすい。
二元ループをするケースで結構はまったので、
メモを残しておく。
(例)URLのBodyパラメータを手作業で分解する場合
Bodyパラメータはこんな感じを想定
hoge=1&fuga=2&piyo[]=1&piyo[]=2
ここではInputStreamから抜かないで、一度分解したのち、文字列に戻すということをやる。
これを従来の処理でやると以下になる。
Map<String, List<String>> paramsBody = new LinkedHashMap<String, List<String>>();
StringBuffer buffer = new StringBuffer();
// サーブレットリクエストからパラメータの情報をとる
Map<String, String[]> params = servletRequest.getParameterMap();
// 回しながら、List型に変換して、さらに文字列を構築する
String sep = "";
for (Iterator<Entry<String, String[]>> iterator = params.entrySet().iterator(); iterator.hasNext();) {
Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) iterator.next();
String name = entry.getKey();
String[] values = entry.getValue();
if (!paramsBody.containsKey(name)) {
paramsBody.put(name, new ArrayList<String>(Arrays.asList(values)));
}
for (String value : values) {
buffer.append(sep).append(name).append("=").append(WsUrl.decode(value, encoding));
sep = "&";
}
body = buffer.toString();
}
おなじことをラムダ式をつかうと、
Map<String, List<String>> paramsBody = new LinkedHashMap<String, List<String>>();
StringBuffer buffer = new StringBuffer();
// サーブレットリクエストからパラメータの情報をとる
Map<String, String[]> params = servletRequest.getParameterMap();
// 回しながら、List型に変換して、さらに文字列を構築する
String paramString = params.entrySet()
.stream()
.map(entry -> {
String name = entry.getKey();
return Arrays.stream(entry.getValue())
.map(value -> String.format("%s=%s", name, WsUrl.decode(value, encoding)))
.collect(Collectors.joining("&"));
})
.collect(Collectors.joining("&"));
buffer.append(paramString);
body = buffer.toString();
ここまでくるのに結構大変だった。。