garbagetown

個人の日記です

StringUtils

カイシャの新人がコードを見てくれと言うので見てみたら

List<User> list = usersDao.findAll();
String s = "";
for (int i = 0; i < list.size(); i++) {
    s += list.get(i).getName();
    if (i < list.size() - 1) {
        s += ",";
    }
}
return s;

みたいなことになっていた(クラス名とかは適当にぼかしています)。要するにユーザ名をカンマ区切りにした文字列を作りたいらしい。
ツッコミどころ満載過ぎて腰が抜けそうになったのですが、よくよく聞いてみれば for でブン回したり += で結合したりしているのは中国の開発ベンダが書いた部分で、その新人は一部(上記例で言うと getName() の辺り)を書き換えただけだと言う。
それならば仕方ないと言う気がしないでもないけれど、せめて

List<User> list = usersDao.findAll();
StringBuilder builder = new StringBuilder();
for (User user : list) {
    builder.append(user.getName());
    builder.append(",");
}
return builder.subString(0, builder.length() - 1);

くらいは書いて欲しいと伝えたのですが、それでも最後の余分なカンマ切り落としが相当切ない。
Java にも PerlRuby の chop があればなあ、と思って "java chop" で検索したみたら あった 。static import を使えばこんな風に書ける。

List<User> list = usersDao.findAll();
StringBuilder builder = new StringBuilder();
for (User user : list) {
    builder.append(user.getName());
    builder.append(",");
}
return chop(builder.toString());

Commons Lang の StringUtils なんて isEmpty くらいしか使っていなかったよ、と思いながら API を眺めていたら join まであるじゃないか。知らなかった。

List<User> list = usersDao.findAll();
List<String> nameList = new ArrayList<String>();
for (User user : list) {
    nameList.add(user.getName());
}
return join(nameList, ',');

とんだシロウトですみません。