マイペースなRailsおじさん

Ruby、Ruby on Rails、オブジェクト指向設計を主なテーマとして扱います。だんだん大きくなっていくRuby on Rails製プロダクトのメンテナンス性を損なわない方法を考えたり考えなかったりしている人のブログです。

日記(トピック: JavaのflatMapがちょっと気に食わない)

調べたこと

やったこと

  • VMUbuntuvimをセットアップした
    • vim8のターミナルモード、つかいやすい。neovimはターミナルモードのウィンドウから移動するのがだるかった。
  • gatsby
    • GraphQLでクエリを投げてみた。
    • gatsby developでwatchがちゃんとできてないっぽかったけど解決できなかった。

考えたこと

Java.util.StreamのflatMap()はなんか微妙

flatMapの引数はStreamを返す関数。
てことは、リストのリスト(e.g. List<List>)からリスト(List)を得るみたいなありがちな処理は以下のように書くことになる。

注目してほしいのはこの部分。

List<Integer> list = listOfList.stream()
    .flatMap(List::stream) // .flatMap(l -> l.stream())でもいい
    .collect(Collectors.toList());

flatMapは、streamに対して関数を適用して、そこで得られたstreamをすべてくっつけて一つのstreamにします。 てことは受け取ったstreamの中身はリストなので、それをstreamに変換してくっつけると、リストの中身を取り出すことになるわけですね。

いやしかし私はflatMapの引数がstreamを返す関数というのがどうも気に入りません。
単にくっつけるときのstreamの中身を返すだけにしてしまうと、 streamへの変換を行わなければいけないくてそれを自動でやるのは難しいというところでしょうか。 それで、どのように変換するかはプログラマに任せないといけないという事情だと思います。が、どうになならないのかなーと思いました。
というか、その問題を解決しているライブラリがありそうなので調べてみます。

ファイルの重複行を削除するアルゴリズムってどうなってるんだろう

  • メモリに全行読み込む系
    • ハッシュテーブルを使えば、重複の検出は素早く済みそう
  • メモリに全行読み込まない系
    • ファイルをチャンクに分けて少しずつ見ていって、↑に書いたやつをメモリに書く代わりにファイルに書きながら進める
    • 一度ソートしてファイルに書く⇒次の行が同一か見るならいけそう
      • じゃあどうやってメモリに全行読み込まずにソートするんだろう問題

i18nのこと、そろそろちゃんと考えたい

qiita.com

記事のテーマ:i18n(ソフトウェアの国際化対応)は、単に文や時間(タイムゾーン)を差し替えれば済むような簡単なものじゃない。自分たちの文化にはない決まりにしたがって文ができていることがある。場合によっては、そのためのロジックを加えなければ対応できない。そのような対応が必要になるような文化を数多く持った国家で育つと、i18nに対応したプログラムを特に意識せずに書くことができるようになるのではないか。

今の仕事では、英語のUIを持ったサービスを作っているけど、ユーザーの使用言語は3つある。 ので、そのうちi18n対応をすることになりそうな気がしている。 とても興味深かった、というか、そのうちまたお世話になりそう

これからやること

  • flatMapをもう少しきれいに書けるようなライブラリがないか調べる。
  • gatsbyAPIと連携させる

今日は一時間20分くらいで書きました。