java - 克隆谓词

标签 java 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);

修复有效的原因是,当您重新分配p1时,旧的谓词对象不会被修改;它被替换为全新的谓词实例。旧的谓词对象仍然存在,但是,在没有实时引用的情况下,它就符合垃圾回收的条件。

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

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

关于java - 克隆谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41726901/

相关文章:

java - 使用具有不同预期间隔的计时器执行周期性任务

java - 为什么在向 java 数组中插入新元素时会采用负索引值?

list - 查找列表和谓词的任何可能的键合

根据偏好事实对键值对列表进行排序?

java - 如何对 Jsoup 文档进行转义?

java - 为什么这个子字符串问题返回 false?

java - 无法在 glassfish 3.1 中将字符集从 ISO-8859-1 更改为 UTF-8

xpath - 多个括号中连接的谓词的行为与and运算符相同吗?

rust - 使用 trim_end_matches 作为闭包函数 : expected signature . 类型不匹配 .. 找到 "for<' r> 的签名 ..."

ios - 核心数据 NSPredicate 在多个属性列中搜索