自从有了Java8,Java语言和库就仿佛获得可新生。lambda表达式可以允许开发人员编写简洁的“计算片段”,并将它们传递给其他代码。接收代码可以选择在合适的时候来执行"计算片段",这对于构建第三方库有深远的影响。
尤其要指出一点,它彻底改变了集合的使用方式。我们不需要在指定计算 结果的过程(从起始遍历到结尾,如果某个元素满足了某个条件,就根据它计算一个值,然后将值添加到总和中),只需指定想要的什么样的结构。这样,代码就可以重新对计算排序————例如,来充分利用并行的优势。或者,如果你只希望匹配前100个元素,那么你不必在维护一个计算器,程序可以自动停止计算。
lambda 表达式的语法
排序
Java7: public void compare(Stirng first,String second){
Integer.compare(first.lengt(),second.length())
}
Java8: (Stirng first,String second) -> Integer.compare(first.lengt(),second.length())
如果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<>();
list.add("1");
list.add("2");
list.add("4");
list.add("3");
list.sort((String h1, String h2) -> h1.compareTo(h2));
for (String strings: list){
System.out.print(strings);
}
结果:1234
Map forEach
Map<String, String> map = new LinkedHashMap<>();
map.put("key1","1");
map.put("key2","2");
map.put("key4","4");
map.put("key5","5");
map.forEach((k,v) -> System.out.print("k=" + k + " v=" + v + "\n"));
结果: k=key1 v=1
k=key2 v=2
k=key4 v=4
k=key5 v=5
Map merge
Map<String, String> map = new LinkedHashMap<>();
map.put("key1","我和");
map.merge("key1","你",(value, newValue) -> value.concat(newValue));
System.out.print( map.get("key1"));
结果:我和你
Iterable forEach
List<AdgAdRel> list = new ArrayList<>();
AdgAdRel adgAdRel = new AdgAdRel();
adgAdRel.setUrl("url1");
AdgAdRel adgAdRel2 = new AdgAdRel();
adgAdRel2.setUrl("url2");
list.add(adgAdRel);
list.add(adgAdRel2);
list.forEach(adgAdRel1 -> {
Map<String, Object> map =new LinkedHashMap<>();
map.put("url",adgAdRel1.getUrl());
map.forEach((k,v) -> System.out.print("k:"+ k + " v:"+v + "\n"));
});
结果: k:url v:url1
k:url v:url2
性能测试
最开始以为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流处理适合复杂度比较高的判断,比如需要根据某些字段,以及条件进行筛选,流处理性能优势大些。
网友评论