Lambda 表达式和静态或实例字段
Lambda expression and static or instance fields
我们知道 lambda 表达式可以引用和使用静态实例变量、实例变量和局部变量(如果它们实际上是最终的)。这一切似乎没问题。每当我在 Lambdas 上看到任何 session 和 Java 对函数式编程的看法时,我都会看到一个共同点,即 "Writing concurrent code is tough and so adapting functional code helps"。
但是,如果我可以在 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());
}
}
if I can access Static and instance variables in a lambda does this
not defeat this point altogether[?]
lambda 访问静态变量和实例变量的能力不会使整个功能无法提供函数式编程方法。只有当 lambdas 实际上 访问此类数据时才违反纯函数式编程。
而且,听起来您的工作前提可能是错误的。 Lambda 提供了比 Java 以前更方便的高阶函数表示,但没有理由将其视为 Java 向纯函数式语言发展的标志。我相信 永远不会发生。
I know we have parallel streams
which are very helpful in certain concurrent case but still is the
closure scope not broken in Java if we are going towards functional
programming style.
没有什么要求您让您的 lambdas 触及它们无法通过参数触及的任何东西。在将在线程之间共享的 lambda 中避免这种情况是一个非常好的主意,但即使这样也不能保护您免受多线程编程的所有复杂性的影响。
Java 支持——现在更是如此——多种编程范式和混合编程范式。这对程序员来说通常是一件好事,这可能就是为什么许多编程语言似乎都朝着这个方向发展的原因,无论它们从哪里开始。
[W]as there a particular reason to allow these design principles[?]
大多数 Java 语言和标准库开发的动机几乎一直是使语言更易于以各种方式使用,以完成尽可能多的编程任务。 Lambda 的动机似乎更多是为了降低匿名内部 类 的重要性,而不是为了更好地支持函数式编程风格。 FP 角度在很大程度上是顺其自然的,尽管标准库似乎确实抓住了这一点。
我们知道 lambda 表达式可以引用和使用静态实例变量、实例变量和局部变量(如果它们实际上是最终的)。这一切似乎没问题。每当我在 Lambdas 上看到任何 session 和 Java 对函数式编程的看法时,我都会看到一个共同点,即 "Writing concurrent code is tough and so adapting functional code helps"。 但是,如果我可以在 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());
}
}
if I can access Static and instance variables in a lambda does this not defeat this point altogether[?]
lambda 访问静态变量和实例变量的能力不会使整个功能无法提供函数式编程方法。只有当 lambdas 实际上 访问此类数据时才违反纯函数式编程。
而且,听起来您的工作前提可能是错误的。 Lambda 提供了比 Java 以前更方便的高阶函数表示,但没有理由将其视为 Java 向纯函数式语言发展的标志。我相信 永远不会发生。
I know we have parallel streams which are very helpful in certain concurrent case but still is the closure scope not broken in Java if we are going towards functional programming style.
没有什么要求您让您的 lambdas 触及它们无法通过参数触及的任何东西。在将在线程之间共享的 lambda 中避免这种情况是一个非常好的主意,但即使这样也不能保护您免受多线程编程的所有复杂性的影响。
Java 支持——现在更是如此——多种编程范式和混合编程范式。这对程序员来说通常是一件好事,这可能就是为什么许多编程语言似乎都朝着这个方向发展的原因,无论它们从哪里开始。
[W]as there a particular reason to allow these design principles[?]
大多数 Java 语言和标准库开发的动机几乎一直是使语言更易于以各种方式使用,以完成尽可能多的编程任务。 Lambda 的动机似乎更多是为了降低匿名内部 类 的重要性,而不是为了更好地支持函数式编程风格。 FP 角度在很大程度上是顺其自然的,尽管标准库似乎确实抓住了这一点。