カイシャの新人がコードを見てくれと言うので見てみたら
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 にも Perl や Ruby の 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, ',');
とんだシロウトですみません。