首页 > 解决方案 > lambda表达式如何初始化参数?

问题描述

我对 lamda 表达感到困惑。

JavaDStream<ConsumerRecord<String, String>> rsvpsWithGuestsStream =
        meetupStream.filter(f -> !f.value().contains("\"guests\":0"));

rsvpsWithGuestsStream.foreachRDD((JavaRDD<ConsumerRecord<String, String>> r) -> {        
    MongoSpark.save(
            r.map(
                e -> Document.parse(e.value())
            )
    );            
});

这是一个 foreachRDD 方法void foreachRDD(VoidFunction<R> foreachFunc),它接受一个功能接口。

在代码中,JavaRDD<ConsumerRecord<String, String>> r作为其call方法内部使用的参数传递。

我想知道 lambda 表达式是否r自行初始化?map因为它只有在初始化时才能调用。在代码中,我看不到它已经创建的任何地方。

谁能帮我理解这一点?

标签: javalambdaparametersinitialization

解决方案


lambda 表达式不会初始化任何东西。它只是一个匿名函数,它用它的参数做一些事情——假设它们已经被初始化了。我不熟悉您的用例(猜它是 Spark),但看起来 r 只是流中的元素之一,并且每个这样的元素都被传递给您的 lambda。下面是一个类似但更简单的示例:

Stream.of("a", "b", "c").forEach(el -> System.out.println(el));

这里 el 是每个元素“a”、“b”和“c”,传递给 lambda,它只是打印它。就像函数一样,lambda 对其参数以及它们是否已初始化一无所知 - 在上述情况下,这取决于调用者 - forEach 方法。


推荐阅读