ラムダ式が導入されて(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();
ここまでくるのに結構大変だった。。
コメントがあればどうぞ