なんでこんなん書いたし
業務で初めてJava8を使いました。(以前の投稿から1年以上経ってます…)
初めてNetbeansというIDEを使いました(今までは基本Visual Studio、まれにeclipseです)。
Netbeansの補完機能により、forループがstream API形式に書き換わります。
流石にちょっとこれはないでしょと思うコードが生成されることがあります。
もともとのコード
擬似コードです。
List<ObjectA> objAList = func();
List<ObjectB> objBList = new List<>();
for (ObjectA objA: objAList) {
ObjectB objB = convertToObjB(objA);
objBList.add(objB);
}
NetBeansさんのヒントに従う
相変わらず擬似コードです
List<ObjectA> objAList = func();
List<ObjectB> objBList = objAList.stream()
.map((objA) -> {
ObjectB objB = convertToObjB(objA);
return objB;
}). forEachOrdered((objB) -> {
objBList.add(objB);
});
私はこうしてほしい
相変わらず擬似ry
そうそう、これも問題があって、convertToObjBが新たに検査例外吐くように修正されたらこのコードコンパイルエラーなんで。
正直for-inで書いたところを何でもかんでもStream APIで置き換えるのは間違ってます。
List<ObjectA> objAList = func();
List<ObjectB> objBList = objAList.stream()
.collect(
() -> new List<ObjectB>(),
(list, objA) -> {
ObjectB objB = convertToObjB(objA);
list.add(objB);
},
(l,r) -> l.addAll(r)
);
結論
ヒントは絶対に従おうっていうコーディング規約が悪いんですが、
ヒントに従うならその自動置換で生成されたコードの意味、あるいは気持ち悪いかどうかもちゃんと考慮してくださいな。
Javascriptの経験しかなく、そのノリで書いちゃったとかほんとにやめてくだしあ><。
ちなみに
何でもかんでもArrayList, HashMapもやめてくだしあ><
順序めちゃくちゃになるのほんと怖い。
LinkedListとかLinkedHashMapとかあるんで順序が重要な場合はこれ使ってよ。
順序関係ない場合はもしかしたらHashSetとか使えるかもしれないんで
何でもかんでも重複除去処理とかかかないでよ〜〜〜〜〜(; ;)