kazurof weblog

技術ネタのメモなどを並べます

POH lite をfor文無しでやってみた。

天才火消しエンジニア霧島「もしPMおじさんが丸投げを覚えたら」|paizaオンラインハッカソンLite について、for文の代わりにStreamを使ってやってみました。 前々回の焼き直しです。 POH lite 天才火消しエンジニア霧島をやってみた。 - kazurof weblog

プログラム

sample code for https://paiza.jp/poh/kirishima

実行結果

kazurofさんの採点結果[100点] 完璧ぃぃ!|paizaオンラインハッカソンLite

実行時間は 0.22 秒から0.36 秒の範囲です。前々回より遅くなっています。 stream導入だけでなく、クラスを増やしたのも原因かもしれません。

stream導入について簡単なコメント

一番簡単なのは、75行目かと。0から配列の長さまで NOT_ASSIGNED を代入するだけです。

35行目は以前はtry節のループを内の処理でした。company.membersの総和を取る処理なのでこれだけを抜出してstreamで処理しました。

31行目は元々の IntStream を、List へと変換するような処理です。mapToObj を使います。(このメソッドを見つけ出すのに時間がかかった。とほほ。) 変数 i が、未使用であると、NetBeansに警告出されているのですが、解消の仕方がわかりません。(とほほ2)これは追々調べるとして。

40行目から50行目は、mapとforEachとありますが、一緒にしてしまっても良いのでは?とも思っています。(この修正はNetBeansが提示してきた。)小さい処理に分割するのが良いことなのかもしれません。

この中の41行目でもstreamを使っています。IntStream を降順にするため、map(i -> numOfMemberIfUseAll - i + company.members - 1) などと小細工しています。標準機能にないかな。

105行目はnumOfMember以降での -1 以外の最小値を取る処理です。修正前はfor文の外のローカル変数に代入する処理でしたが、min()メソッドで streamから直接算出するようになりました。以前よりも処理が簡素になったと思います。

まとめ

for文をstreamに入れ替えて、全体的にソースが簡素になったような気がします。配列を処理するケースが多かったので、 IntStream s = IntStream.range(start , end); の、パラメータの与え方がキモだった感じです。 stream は慣れというか初期学習コストが必要なのは否めませんが、できるようになったらコードが綺麗に書けるかもです。普及が進めば否応なしに読み書きせざるを得なくなるでしょう。 速度については、paizaの範囲では期待できないかも知れません。