克隆谓词

Cloning a predicate

我想克隆一个 Predicate 对象,我的第一次尝试是:

Predicate<String> p1 = str -> str.isEmpty();
Predicate<String> p2 = str -> p1.test(str);

但在那种情况下,如果 p1 改变,p2 也会改变。有没有办法克隆谓词,使 p2 不改变?

您面临的问题不是谓词要改变,而是谓词隐式引用的外部变量之一要改变。因此,复制谓词没有帮助,因为它已经是不可变的。

创建一个临时变量来捕获 p1 的值应该可以解决这个问题:

Predicate<String> p1 = str -> str.isEmpty();
final Predicate<String> pTemp = p1;
Predicate<String> p2 = str -> pTemp.test(str);

此修复起作用的原因是当您 re-assign p1 时,旧的谓词对象不会被修改;它被一个全新的谓词实例所取代。旧的谓词对象仍然存在,但是,在没有实时引用的情况下,它有资格进行垃圾收集。

当您添加 pTemp 时,旧谓词会从两个变量引用 - 即 p1pTemp。此时,re-assigning p1pTemp 没有影响,因此 p2 的行为也将保持不变。

我想当您逐步构建谓词时,这在循环中会更有用。