在我们开发过程中经常会使用到JAVA8的新特性,但是在任何场景下 lambda 表达式一定高效吗
废话不多说直接上代码了举例子
private static void baduseLambda(){
List<String> names =Arrays.asList("anna","Ocean","abc")
//求以"a"开头最长的字符串的数值
// Lambda实现
int longestNameSize=
name.Stream().filter(s -> s.startsWith("a"))
.mapToInt(String::length)
.max()
.getAsInt();
//普通迭代器实现方法
int longest=0;
for(String str :names){
if(str.startsWith("a")){
int len=str.length()
longest =Math.max(len.longest);
}
}
System.out.println(longest);
}
很显然,第一种方式使用java8 中的StreamAPI 的方式看起来简单直观,但是也有两个明显的弊端:
1.迭代的次数非常多,迭代的次数与表达式中调用函数的次数是相等的,我们可以看到第一种中像filter()、maToint()这样的函数都是一个迭代的过程
2.迭代的过程会频繁产生中间结果,每一次函数调用都产生一次中间结果,中间结果也是需要保存在JVM内存中的,如果你的List非常的大,这样的消耗也是无法接受的
而第二种普通迭代器的方式,只用了一次迭代,将三个操作放在一次迭代之中,减少了迭代次数,也避免了存储中间结果,这就是流水线式操作,效率明显比lammbda和StreamAPI更高
所以在我们编写代码之前要想清楚我们想要的结果是什么,分析一下用原始的方法更好,还是用新的java8API,需要我们自己去根据业务需求来决定使用哪种效率更高