我想克隆一个 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);
修复有效的原因是,当您重新分配p1
时,旧的谓词对象不会被修改;它被替换为全新的谓词实例。旧的谓词对象仍然存在,但是,在没有实时引用的情况下,它就符合垃圾回收的条件。
当您添加 pTemp
时,旧谓词将被两个变量引用 - 即 p1
和 pTemp
。此时,重新分配 p1
对 pTemp
没有影响,因此 p2
的行为也将保持不变。
我想当您增量构建谓词时,这在循环中会更有用。
关于java - 克隆谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41726901/