Lambda表达式和静态或实例字段

时间:2018-05-24 18:22:55

标签: java lambda java-8 functional-programming purely-functional

我们知道lambda表达式可以引用并使用静态实例变量,实例变量和局部变量(如果它们实际上是最终的)。这一切似乎都没问题。每当我看到关于Lambdas的任何会话和Java对函数式编程的看法时,我都会看到一个共同点,即#34;编写并发代码很难,因此调整功能代码有助于"。 但是,如果我可以访问lambda中的静态和实例变量,这不会完全打败这一点。我知道我们有并行流在某些并发的情况下非常有用,但如果我们转向函数式编程风格,仍然是Java中的封闭范围。

此外,我们应该在函数式编程中创建纯函数。但是,如果我依赖于实例的状态,那么我的函数就不是纯粹的。

我可能不正确地推断我所分享的内容,但如果我当时有特殊理由允许这些设计原则。

public class UsingStaticVariables {

    static int staticTest = 10;

    public static void main(String args[]) {

        staticTest++;
        System.out.println("Static test first value is " + staticTest);
        Supplier<Integer> supplier = () -> {return staticTest++; };
        staticTest++;
        System.out.println("Static test second value is " + staticTest);
        System.out.println("Static Test lambda output is " + supplier.get());

    }
}

1 个答案:

答案 0 :(得分:5)

  

如果我可以访问lambda中的静态和实例变量,那么这样做   不要完全打败这一点[?]

lambdas访问静态和实例变量的能力并不能使整个功能在提供函数式编程方法时失败。只有当lambdas 实际访问此类数据时,才会违反纯函数式编程。

但是,听起来你可能是在假的前提下工作。 Lambda提供了比Java以前更高级函数的更方便的表示,但没有理由将其作为Java转向纯函数式语言的标志。我相信 永远不会发生。

  

我知道我们有并行流   这在某些并发案例中非常有用,但仍然是   如果我们要实现功能,那么Java中的封闭范围不会被打破   编程风格。

没有什么要求你让你的 lambdas触摸他们无法通过他们的论点达到的任何东西。并且避免这种情况在lambda中是一个非常好的想法,它将在线程之间共享,但即使这样也不能保护你免受多线程编程的所有复杂性的影响。

Java支持 - 现在更加如此 - 多种编程范例和混合编程范例。对于程序员来说这通常是一件好事,这可能是为什么很多编程语言似乎朝这个方向发展,无论他们从哪里开始。

  

[W]因为有特殊原因允许这些设计原则[?]

大多数Java语言和标准库开发的动机几乎总是使语言更容易以各种方式使用,尽可能多的编程任务。 Lambdas似乎更倾向于减少匿名内部类的重要性,而不是任何为函数式编程风格提供更好支持的理想。尽管标准库似乎确实已经确定了这一点,但FP角度很大程度上适用于此。