はじめに
さて、来年にはJava SE 9が出るらしいですが。
最近、僕のプロジェクトもJava SE 8になりまして、
普段嬉々としてlambdaとかメソッド参照とか使いたがっている今日このごろです。
そんな中、ちょっとStream APIの布教活動したよーという話。
プロジェクトメンバーの現状
ケースバイケースなので、無理に使う必要はないですが、
結局Java SE 6ぐらいの書き方でみんな書いてる感じです。
なぜ使わないのか
単純に知らないのだろうなという感じでした。
知らないというのは
・使っているのバージョンを知らない(Java SEの6なのか7なのか8なのか)
・Stream APIを知らない
という感じ。
話してみてそこら辺が分かっただけでも良い材料になったなとか思います。
ススめる前準備
とりあえず、ちょっと複雑なコレクション操作をする要件だったので、
これはmapしてfilterしてcollectで出来そうだなぁとか
軽めのイメトレをしました。
多少抽象的に言うと、
取得した情報の売り買いの情報を各店舗の各従業員単位にまとめるって感じです。
DBから取得した時点では売り買いごちゃまぜ。
同じテーブルに売買の情報が入ってて、売と買の情報がフラグで切り替えられるという
1レコードで売りか買いの情報を表す感じ。
まとめるイメージはこんなん。
軽くススめてみる
ということで、イメトレ完了したので、まぁこれでオススメも出来よう、という感じです。
ススメルやり方は今のとこ3つぐらい思いつきます。
1.大勢を集めてデモする。説明する
2.一人一人にさりげなくススメル
3.偉い人に打診してStream API使おうぜってプロジェクト規約とかに盛り込む
で、一番ラクな2をやろうという感じです。
そんな僕偉くもないし立派でもないし。
今回はクチコミのイメージで話してみました。
Aさん「〇〇な処理があって難しそうなんですよね…。ループしてチェックして…」
ぼく「あぁ、確かに複雑ですね。なんか、JavaにStream APIっていうのがあるらしいんですよ」
Aさん「なんですかそれ?」
ぼく「Javaのハチから入ったらしいす」
JUnitで動きを説明する
口で説明してもいまいちピンとこないだろうと思い、
JUnitでコード書いて示しました。
なるべく、その機能をイメージさせるように書きました。
HogeDao dao = new HogeDao(); List<Hoge> hogeList = dao.findData(); List<Hoge> sellList = hogeList.stream() // Stream化 .filter(hoge -> hoge.getType().equals("売り")) // 売りの情報で絞込 .collct(Collectors.toList()); // リスト化 for(Hoge sell : sellList) { // 「買い」の情報はない assertThat(sellList.getType(), is("売り")) }
※ちなみに上記コードはコンパイルもテストもしてません(アカン)
ぼく「こんな感じで動きます」
Aさん「その…mapってメソッドの中で変数は使えるんですが」
ぼく「使えますよ、ここはboolean返せばオッケーです」
Aさん「それなら使えそうですね!」
使ってもらった感想
実際使ってもらったら、コードレビューの時にはStream APIを使いこなしていて驚きました。
同じような処理の実装をAさんがStream APIなしで実装していたものも既存であったのですが
かなり可読性が上がってステップ数も減り、保守性が上がった感じです。
まとめ
今回は登場人物は僕とAさんだけで大した話ではないですが、
「自分だけがJava SE 8の情報を持っている」みたいなところからの
脱却の足がかりになったかなと思います。
僕は派手なことは出来ないんで、これからもじみーにこういう
口コミ作戦で色々広めていければなぁとw
今回、ラッキーだったポイントとしては
・実装の相談を前もってしてもらった
・オススメしてそれを上手く取り込むスキルのある人だった
・僕の説明で理解してもらえた
・特にこだわりなく実践してもらえた
というところです。
もっと自分からコミュニケーションをしたり、
困っていることをピックアップできるプロセス盛り込んだりとかしていかないと
って感じですね。
あと、オススメするにも
・理解が早そうな人
・実践できそうな人
から優先して地盤を固めていきたいですね。
秘伝のソースコードや秘伝の運用にへばりついたような人は
なるべく回避して無難にやる感じで。
ダメ元でやってみるとなんとかなるもんだなぁ、という話でした。
2 件のコメント:
Aさん「その…mapってメソッドの中で変数は使えるんですが」
コード例中に map 出てきてないし、あとの会話を見ると filter?
それから for でくるくる回してるところ、 allMatch とか使えないんですか?( java 分からないから何とも言えないんですけど、 stream な話してるのにそこは拡張 for なのかーと思ったりしました。
〉あやぴーさん
あ、そうですね…!説明したときはmapも使ってたんですけど、コードちょっと間違えました。時間あるときに直します!
allMatchはまさしくあるみたいです!
僕も勉強中で全然使いこなせてない…。
目的としてはmapとfilterとcollectぐらいを覚えてもらおうという感じでして。
あえて、他の部分は今までのJavaと同じ書き方にしてるというのもあります(あと単純に僕の力不足もあります)
しかし、ループしてassertって嫌ですね、我ながら。
コメントを投稿