代码之家  ›  专栏  ›  技术社区  ›  Pulkit Gupta

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

  •  4
  • Pulkit Gupta  · 技术社区  · 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());
    
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  5
  •   John Bollinger    8 年前

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

    这个 能力 对于lambda来说,访问静态变量和实例变量并不会使整个特性在提供函数编程方法时失败。只有当羊羔 实际上是这样 访问此类数据是违反纯函数编程的。

    但是,听起来你可能是在一个错误的前提下工作。LAMBDAS提供了比Java以前更高级的函数更方便的表示,但是没有理由认为这是Java走向纯函数语言的标志。我相信 那个 永远不会发生。

    我知道我们有平行的溪流 这在某些并发情况下非常有用,但仍然是 如果我们要实现功能,Java中的闭合范围不会被破坏 编程风格。

    什么都不需要你去做 你的 兰伯斯通过他们的争论触及到任何他们无法触及的东西。在将在线程之间共享的lambda中,避免这种情况是一个很好的主意,但即使这样也不能保护您免受多线程编程的所有复杂问题的影响。

    Java支持——甚至更为现代——多个编程范式和混合编程范式。对于程序员来说,这通常是一件好事,这可能就是为什么许多编程语言似乎朝着这个方向移动,而不管它们从哪里开始。

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

    大多数Java语言和标准库开发的动机一直以来都是为了使语言更容易以各种方式使用,因为尽可能多的编程任务。lambda的动机似乎更多的是为了减少匿名内部类的重要性,而不是为了更好地支持函数式编程风格。FP角度在很大程度上是为乘坐而来的,尽管标准库似乎真的抓住了这一点。