克隆谓词

时间:2017-01-18 18:31:56

标签: java predicate

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

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

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

1 个答案:

答案 0 :(得分:2)

您面临的问题不是谓词会发生变化,而是谓词隐含地引用的外部变量之一将会发生变化。因此,制作谓词的副本无济于事,因为它已经是不可变的。

制作一个临时变量以捕获p1的值应解决此问题:

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

修复工作的原因是当您重新分配p1时,旧的谓词对象不会被修改;它被一个全新的谓词实例取代。旧的谓词对象仍然存在,但是,如果没有实时引用,它就有资格进行垃圾收集。

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

我认为当你逐步构建一个谓词时,这在循环中会更有用。