cod*_*eme 9 java lambda mutation java-8 java-stream
为什么第二个代码(带有流的代码)比第一个代码更好?
第一:
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;
}
Run Code Online (Sandbox Code Playgroud)
第二:
System.out.println(total);
System.out.println(
values.stream()
.map(e-> e*2)
.reduce(0, (c, e)-> c + e));
Run Code Online (Sandbox Code Playgroud)
Syl*_*ter 10
变异正在改变一个对象,是编程语言中常见的副作用.
具有函数契约的方法将始终将相同的值返回到相同的参数,并且没有其他副作用(如存储文件,打印,读取).因此,即使你在你的函数中改变临时值,它仍然是纯粹的外部.通过将您的第一个示例放在函数中演示它:
public static int squareSum(const List<Integer> values)
{
int total = 0;
for(int e : values) {
total += e * 2; // mutates a local variable
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
纯函数方法甚至不更新局部变量.如果你把第二个版本放在一个函数中它将是纯粹的:
public static int squareSum(const List<Integer> values)
{
return values.stream()
.map(e-> e*2)
.reduce(0, (c, e)-> c + e);
}
Run Code Online (Sandbox Code Playgroud)
对于一个人说知道,长期以来一直倾向于多功能风格等语言map
,并reduce
用lambda
是很自然的.两个版本都易于阅读和易于测试,这是最重要的部分.
Java有功能类.java.lang.String
是其中之一.
变异正在改变对象的状态,无论是列表还是某个自定义对象。
您的特定代码不会以任何方式导致列表发生变化,因此使用 lambdas 而不是普通的旧迭代在这里没有实际好处。而且,怪我,但在这种情况下我会使用迭代方法。
有些方法说,每当您需要修改对象/集合时,您都需要返回一个带有修改后数据的新对象/集合,而不是更改原始对象/集合。例如,当您同时访问一个集合并且它正在从另一个线程更改时,这对集合很有用。
当然,这可能导致内存泄漏,因此有一些算法用于管理内存和收集的可变性,即只有更改的节点存储在内存中的另一个位置。
虽然 Royal Bg 是对的,但在任何一种情况下都不会改变您的数据,但第二个版本没有优势并不是真的。第二个版本可以是多线程的,没有歧义。
由于我们不期望迭代列表,因此我们可以将操作放入一个多线程的上下文中并在 gpu 上解决它。在后者中,集合中的每个数据点都乘以 2。然后减少(这意味着每个元素都加在一起),这可以通过减少来完成。
后者的代码有许多在前者中没有的潜在优势。虽然两个代码元素实际上都没有发生变异,但在第二个元素中,我们得到了非常明确的约定,即项目在发生这种情况时不能发生变异。所以我们知道,向前、向后迭代列表或应用多线程等都没有关系。实现细节可以稍后填写。但是,只有当我们知道突变不可能发生并且流根本不允许它们时。
归档时间: |
|
查看次数: |
10902 次 |
最近记录: |