Java 8-从Collection.stream.map()调用多参数方法

时间:2018-11-29 14:17:14

标签: java lambda java-8 java-stream

一段时间以来,我一直在使用Java 8 Streams。我遇到了一种情况,我需要流过一个List并将每个元素与另一个参数一起传递给静态方法。在Java 8中可以吗?

........
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()传递指定字符串?

4 个答案:

答案 0 :(得分:6)

使用lambda表达式:

names.stream().map(name -> MyClass.createReport(name,designation))...

答案 1 :(得分:2)

您可以编写方法createReport的{​​{3}}版本。

紧急createReport

我们需要交换参数的顺序,因为每个designation的{​​{1}}是相同的。另外,我们只需要调用not curried方法即可。

name

实际行动

Function<String, Consumer<String>> createReportCurry = (designation) -> (name) -> {
    createReport(name, designation);
};

答案 2 :(得分:0)

您还可以使用以下替代方法:

IntStream.range(0, names.size())
         .forEach(i -> MyClass.createReport(names.get(i), names.get(i)));

答案 3 :(得分:0)

上面的答案非常好,但是让我们尝试解释为什么不能首先运行代码:

您的代码:

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建议的功能。