自从有了Java8,Java语言和库就仿佛获得可新生。lambda表达式可以允许开发人员编写简洁的“计算片段”,并将它们传递给其他代码。接收代码可以选择在合适的时候来执行”计算片段”,这对于构建第三方库有深远的影响。
尤其要指出一点,它彻底改变了集合的使用方式。我们不需要在指定计算 结果的过程(从起始遍历到结尾,如果某个元素满足了某个条件,就根据它计算一个值,然后将值添加到总和中),只需指定想要的什么样的结构。这样,代码就可以重新对计算排序————例如,来充分利用并行的优势。或者,如果你只希望匹配前100个元素,那么你不必在维护一个计算器,程序可以自动停止计算。
lambda 表达式的语法
排序
Java7: public void compare(Stirng first,String second){ |
如果lambda表达式的参数类型可以被推导,那么就可以省略它们的类型,例如:Comparator<String> comp = (first,second) -> Integer.compare(first.lengt(),second.length())
字符串拼接
String.join(参数)参数可以来自于一个数组或者一个Iterable<? extends CharSequence>对象Java7: String str="a"+"/"+"b"+"/"+"c"
Java8: String str=String.join("/","a","b","c");
Java8: String[] strs=["a","b","c"]
String str=String.join("/",strs);
集合
Java 8 中添加到集合类和接口方法
类/接口 | 方法 |
---|---|
Iterable | forEach |
Collection | removeIf |
List | replaceAll, sort |
Map | forEach ,replace ,replaceAll, remove(key,value)(只有当key到value的映射存在时才删除),putIfAbsent, comput, computeIf (Absent / Present),merge |
Iterabtor | forEachRemaining |
BitSet | stream |
Map接口有许多对于并发十分重要的方法[暂无]
接下来展示一些比较Java 8 比较常用的方法实例
List sort
List<String> list = new ArrayList<>(); |
Map forEach
Map<String, String> map = new LinkedHashMap<>(); |
Map merge
Map<String, String> map = new LinkedHashMap<>(); |
Iterable forEach
List<AdgAdRel> list = new ArrayList<>(); |
性能测试
最开始以为Java 8 流性能会比Java 7 好,测试结果如下:
//5条数据
for (AdgAdRel adgAdRel:adgAdList) {
Map<String, Object> map =new LinkedHashMap<>();
map.put("showTime",adgAdRel.getShowTime());
map.put("width",adgAdRel.getWidth());
map.put("height",adgAdRel.getHeight());
map.put("type",adgAdRel.getType());
resultMap.add(map);
}
//java 7循环 1毫秒
System.out.print(System.currentTimeMillis()-date);
//java 8循环 65左右毫秒
System.out.print(System.currentTimeMillis()-date);
总结
对于一个简单集合来说,单纯的从集合中获取数据,Java8流处理的性能没有Java7好。
Java8流处理适合复杂度比较高的判断,比如需要根据某些字段,以及条件进行筛选,流处理性能优势大些。