Java Lambdas可以拥有州吗?

时间:2018-01-23 11:59:48

标签: java lambda

在关于lambdas和匿名类之间差异的一个论点中,在这篇文章中:

Java8 Lambdas vs Anonymous classes

我读到了一个声称" Lambdas可以拥有州"就像匿名类实例一样。

据我所知,你不能添加属于lambda的用户定义的状态,因为没有办法在java lambda函数的实现上定义实例成员。

例如:

Runnable r=  () -> { int x = 5;  }; // defines a local - no way to define instance
Runnable r2 = new Runnable() {
    int x;  // defines state via instance member
    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
};

只是为了澄清,我不是试图将状态引入lambda,因为我认为这违背了意图。我只是想验证或反驳上述堆栈溢出问题上由信誉良好的来源做出的技术性声明。

3 个答案:

答案 0 :(得分:6)

尽管lambda函数没有像实例变量那样的东西,但它可以更新某些状态。根据你如何看待它,可以说lambda函数有自己的状态。

E.g。

Supplier<Integer> makeCountingLambda() {
    final int[] counter = new int[1];
    return (() -> ++counter[0]);
}

Supplier<Integer> f = makeCountingLambda();
f.get(); // 1
f.get(); // 2

f是一个lambda函数。每次调用get()时它都会提供一个新值,因为它的状态已更新。

这样的东西似乎是引用的评论所描述的内容。

答案 1 :(得分:1)

不确定你的意思是什么。 如果你的问题是“可以使用lambda携带值,每次调用相同的lambda时都能记住这个值”,那么答案就是否定。你可以采取一些技巧来达到这种行为,但它们不适用于此。如果你想拥有一个“状态”,那么你最好使用一个类!

让我知道这不是你的意思!

答案 2 :(得分:1)

简短回答?没有 答案很长? Lambdas并不意味着有州。 lambdas的总体思想是基于具有一次性功能。请阅读lambda文档以获取更多详细信息。 http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html 希望这会有所帮助。