JavaSE 8

自从有了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流处理适合复杂度比较高的判断,比如需要根据某些字段,以及条件进行筛选,流处理性能优势大些。

文章作者: 陈 武
文章链接: http://www.updatecg.xin/2017/09/09/JavaSE8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我的学习记录
打赏
  • 微信
  • 支付寶

评论