因为在React和FP中使用频繁,我已经阅读了很多关于 map
, reduce
和 filter
的内容。如果我们像下面这样写:
let myArr = [1,2,3,4,5,6,7,8,9]
let sumOfDoubleOfOddNumbers = myArr.filter(num => num % 2)
.map(num => num * 2)
.reduce((acc, currVal) => acc + currVal, 0);
运行了三个不同的循环。
我也阅读过Java 8流的相关内容,知道它们使用所谓的单子(monad),即首先存储计算结果。它们仅在一次迭代中执行一次。例如,
Stream.of("d2", "a2", "b1", "b3", "c")
.map(s -> {
System.out.println("map: " + s);
return s.toUpperCase();
})
.filter(s -> {
System.out.println("filter: " + s);
return s.startsWith("A");
})
.forEach(s -> System.out.println("forEach: " + s));
// map: d2
// filter: D2
// map: a2
// filter: A2
// forEach: A2
// map: b1
// filter: B1
// map: b3
// filter: B3
// map: c
// filter: C
PS:Java代码来自:http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/
许多其他语言也使用这种方法,那么在JS中是否有同样的方法呢?
_.chain
时采用惰性求值。 - 4castlemyArr.reduce((acc, num) => num % 2 ? acc += num * 2 : acc, 0);
。 - guijob