【发布时间】:2021-07-13 18:45:08
【问题描述】:
使用 java 流,我有一个 ClassA 列表,应用于流进行过滤,所以 list.stream().filter(predicate).etc。这样,谓词将需要 ClassA 的谓词才能应用,但我真的想要字符串的谓词,因为 ClassA.Field1 是字符串类型。因此,与其让谓词包含 f -> f.getField1().equals("foo"),我希望它是 f -> f.equals("foo"),直接在字段上操作。原因是因为我也有ClassB、ClassC、predicateA、predicateB、predicateC。我不想使用多个谓词,我想使用一个谓词,因为所有谓词的操作都相同,请检查字符串是否具有预期的内容。
这个缺少什么链接,我需要如何转换流来做到这一点?
对于其他上下文,过滤后我需要从过滤列表中提取第二个字段,因此目标是拥有 ClassA.Field2.val(例如,我需要提取与该项目名称相关联的项目 ID ,所以我按名称过滤)
另外:这是一个简化,实际需要使用startsWith,而不是equals。
【问题讨论】:
-
在应用
filter运算符之前应用map运算符,如list.stream().map(ClassA::getField1).filter(predicate)。缺点是流将不再属于 ClassA,而是属于 String -
听起来所有这些类都有共同的状态。您是否考虑过将其提取到超类中,然后简单地拥有一个
Predicate<Superclass>? -
@Slaw 对我们的复杂模型进行了大量重构,保持当前模型优先于仅使用一个谓词,但是是的,以后这样做是个好主意
标签: java java-8 java-stream