Lambdaj

在阅读《java8 实战》时,看到这个框架。

其中的思想和 lambda 是不谋而合的。

如果你使用 jdk7-,那么可以看看。如果使用 jdk8+,那么使用 API 即可。

对比

需求:

查询用户最近的中奖信息 并返回中奖名单列表

jdk7

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 返回用户最近4条的中奖纪录 List<UserWinning> uwList = Lists.newArrayList(new UserWinning(userId, 1), new UserWinning(userId, 2), new UserWinning(userId, 3), new UserWinning(userId, 1)); //提取奖品ID List<Integer> awardIdLsit = new ArrayList<>(uwList.size()); for(UserWinning uw : uwList){ awardIdLsit.add(uw.getAwardId()); } //根据奖品ID查询奖品 List<Award> awardList = Lists.newArrayList(new Award(1, "奖品一"), new Award(2, "奖品二"), new Award(3, "奖品三")); //List --> Map 得到奖品ID和奖品名称Map Map<Integer, String> awardIdNameMap = new HashMap<>(awardList.size()); for(Award a : awardList){ awardIdNameMap.put(a.getId(), a.getName()); } // 返回奖品名称列表 List<String> nameList = new ArrayList<>(awardIdLsit.size()); for(Integer id : awardIdLsit){ nameList.add(awardIdNameMap.get(id)); } System.out.println(nameList);
  • 评价

感觉非常繁琐 特别是当你习惯了Java8的函数式编程后

guava

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
List<UserWinning> uwList = Lists.newArrayList(new UserWinning(userId, 1), new UserWinning(userId, 2), new UserWinning(userId, 3), new UserWinning(userId, 1)); //提取奖品ID ImmutableList<Integer> awardIdList = from(uwList).transform(new Function<UserWinning, Integer>() { @Override public Integer apply(UserWinning input) { return input.getAwardId(); } }).toList(); System.out.println(awardIdList); //根据奖品ID查询奖品 List<Award> awardList = Lists.newArrayList(new Award(1, "奖品一"), new Award(2, "奖品二"), new Award(3, "奖品三")); //List --> Map 得到奖品ID和奖品Map ImmutableMap<Integer, Award> idAwardMap = uniqueIndex(awardList, new Function<Award, Integer>() { @Override public Integer apply(Award input) { return input.getId(); } }); // 返回奖品名称列表 ImmutableList<String> awardNameList = from(awardIdList).transform(new Function<Integer, String>() { @Override public String apply(Integer input) { return idAwardMap.get(input).getName(); } }).toList(); System.out.println(awardNameList);
  • 评价

代码不够简洁, 看的时候还是容易被这些匿名内部类干扰,虽然写的时候也很流畅。

优点是返回的集合都是不可变的。

lambdaj

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
List<UserWinning> uwList = Lists.newArrayList(new UserWinning(userId, 1), new UserWinning(userId, 2), new UserWinning(userId, 3), new UserWinning(userId, 1)); //提取awardIdList List<Integer> awardIdList = extract(uwList, on(UserWinning.class).getAwardId()); System.out.println(awardIdList); List<Award> awardList = Lists.newArrayList(new Award(1, "奖品一"), new Award(2, "奖品二"), new Award(3, "奖品三")); //List -> Map Map<Integer, Award> idAwardMap = index(awardList, on(Award.class).getId()); //得到奖品名称列表 List<String> nameList = convert(awardIdList, new Converter<Integer, String>() { @Override public String convert(Integer from) { return idAwardMap.get(from).getName(); } }); System.out.println(nameList);
  • 评价

看起来很简洁, 一目了然。

但对泛型支持的不如Guava, 如List转Map代码自动生成的是Map<Integer,Object> 需要显式修改为Map<Integer,Award>。

另外也不确定相比Guava性能如何。

个人感受

很多框架层面的优化支持,永远是无法超越语言的原生支持的。

但是思想是一样的,简化,自然。

参考资料

《java8 实战》

java框架选型 Guava vs Lambdaj

Lambdaj