Java 将LongPredicate(或类似)声明为私有静态类变量而不是非静态类变量时出现的任何并发问题

Java 将LongPredicate(或类似)声明为私有静态类变量而不是非静态类变量时出现的任何并发问题,java,lambda,static,java-stream,predicate,Java,Lambda,Static,Java Stream,Predicate,我已将一个长谓词声明为: private longzero=id->id>0L; 既然这是一个非捕获的lambda,那么将其声明为静态不是更好吗 另外,当声明为静态时,如果由多个线程访问或与并行流一起使用,是否会出现任何并发问题?如果您查看 lambda表达式类似于方法: 及 lambda表达式的求值生成函数接口的实例 这意味着您基本上得到了一个实现LongPredicate的匿名类,因为该类只有一个方法,没有状态,所以它是线程安全的——除非该方法执行的是非线程安全的操作,而您发布的表达式中没

我已将一个
长谓词
声明为:

private longzero=id->id>0L;
既然这是一个非捕获的
lambda
,那么将其声明为
静态
不是更好吗

另外,当声明为
静态
时,如果由多个线程访问或与并行
流一起使用,是否会出现任何并发问题?

如果您查看

lambda表达式类似于方法:

lambda表达式的求值生成函数接口的实例

这意味着您基本上得到了一个实现
LongPredicate
的匿名类,因为该类只有一个方法,没有状态,所以它是线程安全的——除非该方法执行的是非线程安全的操作,而您发布的表达式中没有这种情况


这意味着可以将对该类实例的引用存储在静态变量中。但是,您可能还希望将
isAboveZero
设置为final,这样就不能在运行时替换它(也请参见我的评论)。

好吧,您的lambda将导致一个匿名类实现
LongPredicate
,并且由于该类没有任何状态,因此lambda本身不应该涉及并发问题。顺便说一句,我假设
isAboveZero
在运行时永远不会更改,因此您不妨声明它
final
“在类级别”意味着
静态
,因此,是否最好声明它
静态
,这是一个奇怪的问题。如果没有
static
,它就不是类级别的,并且会在类的每个实例中浪费内存。关于并发性,正如Thomas所说,没有问题,如果有问题,你也有问题,就像没有
静态
一样,每个实例中都有一个不同的引用变量,但实际上它仍然引用相同的
谓词
对象。@Thomas我想你可以加上这个作为答案