克隆谓词
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
时,旧谓词会从两个变量引用 - 即 p1
和 pTemp
。此时,re-assigning p1
对 pTemp
没有影响,因此 p2
的行为也将保持不变。
我想当您逐步构建谓词时,这在循环中会更有用。
我想克隆一个 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
时,旧谓词会从两个变量引用 - 即 p1
和 pTemp
。此时,re-assigning p1
对 pTemp
没有影响,因此 p2
的行为也将保持不变。
我想当您逐步构建谓词时,这在循环中会更有用。