ラムダ式を触る
Java8から利用可能になったラムダ式(lambda式)を触ってみる。
匿名クラスの記述が簡略化になることがメリットの一つであるらしい。 ソート時にComparatorの匿名クラスを作成する方法がふと頭にわいてきたので、これで試してみる。
扱うクラスの説明
- UserBean
package practice.lambda; import java.util.Date; public class UserBean { private String userId; private String userName; private Date birthDay; public UserBean(String userId, String userName, Date birthDay) { this.userId = userId; this.userName = userName; this.birthDay = birthDay; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getBirthDay() { return birthDay; } public void setBirthDay(Date birthDay) { this.birthDay = birthDay; } }
- PracticeLambda
package practice.lambda; import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class practiceLambda { public static void main(String[] args) throws ParseException { List<UserBean> userList = new ArrayList<UserBean>(); userList.add(new UserBean("001", "taro", DateFormat.getDateInstance() .parse("1980/02/15"))); userList.add(new UserBean("002", "hanako", DateFormat.getDateInstance() .parse("1990/12/07"))); userList.add(new UserBean("003", "jiro", DateFormat.getDateInstance() .parse("1973/08/22"))); // 従来の記法 userList.sort(new Comparator<UserBean>() { @Override public int compare(UserBean o1, UserBean o2) { return o1.getBirthDay().compareTo(o2.getBirthDay()); }; }); for (UserBean user : userList) { System.out.println(user.getUserId() + ":" + user.getUserName() + ":" + user.getBirthDay().toString()); } } }
- UserBeanを使って3ユーザのインスタンス生成
- 誕生日でソート
- コンソール出力
うーん、シンプル。
これをラムダ式の記法を取り込んでみると以下の通りになる。
- PracticeLambda
package practice.lambda; import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class practiceLambda { public static void main(String[] args) throws ParseException { List<UserBean> userList = new ArrayList<UserBean>(); userList.add(new UserBean("001", "taro", DateFormat.getDateInstance() .parse("1980/02/15"))); userList.add(new UserBean("002", "hanako", DateFormat.getDateInstance() .parse("1990/12/07"))); userList.add(new UserBean("003", "jiro", DateFormat.getDateInstance() .parse("1973/08/22"))); // 従来の記法 userList.sort(new Comparator<UserBean>() { @Override public int compare(UserBean o1, UserBean o2) { return o1.getBirthDay().compareTo(o2.getBirthDay()); }; }); // lambda1 userList.sort((UserBean o1, UserBean o2) -> { return o1.getBirthDay().compareTo(o2.getBirthDay()); }); // lambda2 userList.sort((UserBean o1, UserBean o2) -> o1.getBirthDay().compareTo(o2.getBirthDay())); // lambda3 userList.sort((o1, o2) -> o1.getBirthDay().compareTo(o2.getBirthDay())); for (UserBean user : userList) { System.out.println(user.getUserId() + ":" + user.getUserName() + ":" + user.getBirthDay().toString()); } } }
- lambda1・・・ラムダ式の基本的な記法。まだ直観的で分かる気がする。
- lambda2・・・lambda1から処理内容が一文で表せるので、returnと{}を省略した方法。うむ、lambda1より簡潔で良い気がする。
- lambda3・・・lambda2から型を省略した記法。え、文字数こそ少ないが、o1とかo2の型分かりにくいし、さすがにカオス過ぎない???
うぅむ、匿名クラスの簡略化という点だけ考えると、やりすぎ厳禁な気がする。 根付いてきたら普通に読めそうだけど、今の段階でこのコードを見ると一瞬目が点になりそう。
とかなんとか考えてたら、こんなページを発見。
(o1, o2) -> o1 - o2 なんて呪文はもうやめて! - Java8でのComparatorの使い方 - Qiita
あら、ラムダ式とか関係なく、Comparatorインターフェースも進化してたのね。
うーむ、結局ラムダ式がもたらす恩恵を享受できてない気がするが、 どういうシーンで使うことになるのかねぇ。。。?
微妙な結末で終了!