日記(トピック: JavaのflatMapがちょっと気に食わない)
調べたこと
- systemdのsystemctl stopの挙動
- guava
- GitHub - google/guava: Google core libraries for Java
- Javaのユーティリティ系ライブラリ
- 冗長な記述を短くできる。特にCollectionが使いやすくなる
- ImmutableMapは非常によく使う。ImmutableCollectionsExplained · google/guava Wiki · GitHub
- gatsby
guava使ってみた。ImmutableMap便利スギィ!https://t.co/47zTSxBeeB
— ytnk (@__ytnk__) 2018年8月8日
やったこと
考えたこと
Java.util.StreamのflatMap()はなんか微妙
flatMapの引数はStreamを返す関数。
てことは、リストのリスト(e.g. 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のこと、そろそろちゃんと考えたい
記事のテーマ:i18n(ソフトウェアの国際化対応)は、単に文や時間(タイムゾーン)を差し替えれば済むような簡単なものじゃない。自分たちの文化にはない決まりにしたがって文ができていることがある。場合によっては、そのためのロジックを加えなければ対応できない。そのような対応が必要になるような文化を数多く持った国家で育つと、i18nに対応したプログラムを特に意識せずに書くことができるようになるのではないか。
今の仕事では、英語のUIを持ったサービスを作っているけど、ユーザーの使用言語は3つある。 ので、そのうちi18n対応をすることになりそうな気がしている。 とても興味深かった、というか、そのうちまたお世話になりそう
これからやること
今日は一時間20分くらいで書きました。