我对该Function.identity()方法的用法有疑问.
想象一下以下代码:
Arrays.asList("a", "b", "c")
.stream()
.map(Function.identity()) // <- This,
.map(str -> str) // <- is the same as this.
.collect(Collectors.toMap(
Function.identity(), // <-- And this,
str -> str)); // <-- is the same as this.
Run Code Online (Sandbox Code Playgroud)
是否有任何理由你应该使用Function.identity()而不是str->str(反之亦然).我认为第二种选择更具可读性(当然是品味问题).但是,有没有"真正的"理由为什么应该首选?
我需要对此进行清楚的解释,即使我读到这个关于差异的链接但没有明确的清晰度.所以任何人都可以用代码向我解释这一点.
所以,最后从Java 6跳到Java 8,我已经阅读了相当数量的Java 8 Streams API.不幸的是,几乎所有被问到的例子几乎都接近于我想要弄清楚怎么做,但还不够接近.
我拥有的是什么
final List<Function<? super Double, Double>> myList = generateList();
final double myVal = calculate(10);
private double calculate(double val) {
for (Function<? super Double, Double> function : this.myList) {
val += function.apply(val);
}
return val;
}
Run Code Online (Sandbox Code Playgroud)
现在,我已经明白我可以做类似的事情.stream().forEach(),但只适用于foreach和stream需要最终变量.我试图探索一下DoubleStream得到一个sum(),但我需要重新应用当前的和每个Function并将该总和添加到下一个函数,如上面的代码示例所示.
纯流API可以实现这一点吗?
编辑:因此,在对该reduce()区域进行测试后,我对执行此类计算所花费的时间进行了简单测试,结果不支持流.这是一个示例https://gist.github.com/gabizou/33f616c08bde5ab97e56.包括来自相当基本测试的日志输出.
问题描述: 我希望能够使用从另一个类传入的函数的ArrayList(其中函数已在其他类中定义).如果在一个类中定义了可能具有不同输入和返回类型的函数列表,我希望能够将其中一些的ArrayList(可能有重复项)作为参数传递给其他类的构造函数或方法,使用它们执行操作.
代码说明:
下面的代码是一个非常简化的示例,从设计的角度来看并不是很有意义.问题的焦点是该方法getResult()中SomeClass,一般如何,一旦你有他们使用功能的ArrayList.
尝试解决问题: getResult()方法实现是使用函数列表的许多尝试之一的示例.再次,请不要介意代码的设计.它就是这样做的,试图让问题的例子尽可能短.
简单的测试类
package com.Testing;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.function.Function;
public class Tester {
public static void main(String[] args)
{
// Some functions
Function<Integer, Integer> increment = (Integer input) -> {
return input + 1;
};
Function<Integer, Integer> decrement = (Integer input) -> {
return input - 1;
};
Function<Double, Double> timesPi = (Double input) -> {
return input * 3.14;
};
// list of Functions
List<Function> availableMathOperations = …Run Code Online (Sandbox Code Playgroud)