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

Pul*_*kit 4 java lambda functional-programming purely-functional java-8

我们知道lambda表达式可以引用并使用静态实例变量,实例变量和局部变量(如果它们实际上是最终的).这一切似乎都没问题.每当我看到有关Lambdas和Java的函数式编程的任何会话时,我都会看到一个共同点,即"编写并发代码很难,因此调整函数代码会有所帮助".但是,如果我可以访问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());

    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 5

如果我可以访问lambda中的静态和实例变量,这不会完全击败这一点[?]

能力来访问静态和实例变量不会使整个功能的lambda表达式失败是提供一种方法来函数式编程.只有当lambdas 实际访问这些数据时才会违反纯函数式编程.

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

我知道我们有在某些情况下,同时非常有帮助的,但仍然是封闭范围在Java中没有损坏,如果我们对函数式编程风格去并行流.

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

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

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

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