确定 Java 中的 lambda 表达式是无状态还是有状态

2024-01-10

是否有一个函数接受 lambda 表达式的引用并返回一个布尔值,说明 lambda 表达式是否是无状态的?如何确定 lambda 表达式的状态性?


好吧,lambda 表达式只是一个只有一个方法的特殊匿名类的实例。匿名类可以“capture“周围范围内的变量。如果您对有状态类的定义是在其字段中携带可变内容的类(否则它几乎只是一个常量),那么您很幸运,因为那是捕获似乎是如何实现的 https://stackoverflow.com/questions/42298316/java-8-how-to-access-object-and-method-encapuslated-as-lambda。这是一个小实验:

import java.lang.reflect.Field;
import java.util.function.Function;

public class Test {
    public static void main(String[] args) {
        final StringBuilder captured = new StringBuilder("foo");
        final String inlined = "bar";
        Function<String, String> lambda = x -> {
            captured.append(x);
            captured.append(inlined);

            return captured.toString();
        };

        for (Field field : lambda.getClass().getDeclaredFields())
            System.out.println(field);
    }
}

输出看起来像这样:

private final java.lang.StringBuilder Test$$Lambda$1/424058530.arg$1

The StringBuilder参考变成了一个领域匿名 lambda 类(以及final String inlined内联常量是为了提高效率,但这不是重点)。所以这个函数应该在大多数情况下执行:

public static boolean hasState(Function<?,?> lambda) {
    return lambda.getClass().getDeclaredFields().length > 0;
}

编辑:正如 @Federico 所指出的,这是特定于实现的行为,可能不适用于某些奇异环境或未来版本Oracle / OpenJDK JVM.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定 Java 中的 lambda 表达式是无状态还是有状态 的相关文章

随机推荐