Curried
我使用java 8 Streams已经有一段时间了。我遇到了一种情况,我需要通过List进行流式传输,并将每个元素与另一个参数一起传递给一个静态方法。它在java8中可能吗?
........
String designation = "Engineer";
List<String> names = new ArrayList<>();
names.add("ABC");
names.add("DEF");
names.add("GHI");
names.stream().map(MyClass::createReport);
..........
class MyClass {
public static void createReport(String name, String designation) {
System.out.println(name+"t"+designation);
}
}
如何通过stream((.map((传递指定字符串?
使用lambda表达式:
names.stream().map(name -> MyClass.createReport(name,designation))...
您可以编写方法createReport
的当前版本。
CurriedcreateReport
我们需要交换参数的顺序,因为每个name
的designation
是相同的。此外,我们只需要调用not curried方法。
Function<String, Consumer<String>> createReportCurry = (designation) -> (name) -> {
createReport(name, designation);
};
行动中
names.stream().forEach(createReportCurry.apply(designation))
您也可以使用以下选项:
IntStream.range(0, names.size())
.forEach(i -> MyClass.createReport(names.get(i), names.get(i)));
上面的答案很好,但让我们首先解释一下为什么不能运行代码:
您的代码:
names.stream().map(MyClass::createReport);names.stream().map(MyClass::createReport);
JVM意味着什么
names.stream().map(MyClass::createReport);names.stream().map(name -> MyClass.createReport(name));
解决方案使用基本lamba作为@Eran,或使用@Roman建议的函数。