为什么第二个代码(带有流的代码)比第一个代码更好?
第一:
public static void main(String [] args) { List<Integer> values = Arrays.asList(1,2,3,4,5,6); int total = 0; for(int e : values) { total += e * 2; }
第二:
System.out.println(total); System.out.println( values.stream() .map(e-> e*2) .reduce(0,(c,e)-> c + e));
解决方法
变异正在改变一个对象,是编程语言中常见的副作用.
具有函数契约的方法将始终将相同的值返回到相同的参数,并且没有其他副作用(如存储文件,打印,读取).因此,即使你在你的函数中改变临时值,它仍然是纯粹的外部.通过将您的第一个示例放在函数中演示它:
public static int squareSum(const List<Integer> values) { int total = 0; for(int e : values) { total += e * 2; // mutates a local variable } return total; }
纯函数方法甚至不更新局部变量.如果你把第二个版本放在一个函数中它将是纯粹的:
public static int squareSum(const List<Integer> values) { return values.stream() .map(e-> e*2) .reduce(0,e)-> c + e); }
对于一个知道其他语言的人来说,长期以来一直偏爱功能样式地图并且使用lambda减少非常自然.两个版本都易于阅读和易于测试,这是最重要的部分.
Java有功能类. java.lang.String就是其中之一.