Happy3w

Java8 Function应用

2017.01.12
问题:我有一个对象 class GoodData{ private String name; private Timestamp firstTime; private Timestamp secondTime; private Timestamp thirdTime; } 现在我想要创建一个三个Map,用name分别映射firstTime,secondTime,thirdTime. 如果按照常规方式需要写三个如下方法 Map<String, Timestamp> getFirstTimeMap(List<GoodData> datas) { Map<String, Timestamp> m = new HashMap<>(); for (GoodData d : datas) { if (d.getFirstTime() != null) { m.put(d.getName(), d.getFirstTime()); } } return m; } 其他两个方法需要将First分别替换为Second,Third 使用Function后会简化很多,只需要实现如下一个方法 Map<String, Timestamp> getTimeMap(List<GoodData> datas, Function<GoodData, Timestamp> getMethod) { Map<String, Timestamp> m = new HashMap<>(); for (GoodData d : datas) { Timestamp t = getMethod.apply(d); if (t != null) { m.put(d.getName(), t); } } return m; } 分别执行 firstTimeMap = getTimeMap(datas, GoodData::getFirstTime); secondTimeMap = getTimeMap(datas, GoodData::getSecondTime); thirdTimeMap = getTimeMap(datas, GoodData::getThirdTime); 一下子清爽了很多,没有代码,只有语义 其他详细信息可以参见 https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html