gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:53:45 25 4
gpt4 key购买 nike

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

最佳答案

嗯,lambda 表达式只是一个特殊匿名类的实例,它只有一个方法。匿名类可以“捕获”周围范围内的变量。如果您对有状态类的定义是在其字段中携带可变内容的类(否则它几乎只是一个常量),那么您很幸运,因为那是 how capture seems to be implemented .这是一个小实验:

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

StringBuilder 引用变成了 匿名 lambda 类 的一个字段(并且 final String inlined 常量被内联以提高效率,但是这是题外话)。所以这个功能在大多数情况下应该做:

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

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

关于java - 确定 lambda 表达式在 Java 中是无状态的还是有状态的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48887802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com