Java 8 从另一个列表创建谓词列表

Java 8 Creating list of predicates from another list

我正在写下面的代码,但看起来很尴尬。能不能写的更好?最后,代码必须创建一个谓词,该谓词由具有 OR 条件的谓词列表组成。

第一个谓词,它应该附加到谓词列表

Predicate<SomeDto> p1 = t -> StringUtils.isBlank(t.getColor());

来自 someListOfColors 的谓词列表

List<Predicate<SomeDto>> collect = Arrays.stream(somelistOfColors)
            .map(ta -> {
                Predicate<SomeDto> p2 = t -> t.getColor().equals(ta.getCode());
                return p2;
            }).collect(Collectors.toList());

所有谓词都应该用OR条件连接

or(p1, collect.toArray(new Predicate[collect.size()]));

OR 条件的方法

private Predicate<SomeDto> or(Predicate<SomeDto>... predicates) {
    return s -> Arrays.stream(predicates).anyMatch(t -> t.test(s));
}

您可以通过组合谓词来减少您的流:

Predicate<SomeDto> collect = somelistOfColors.stream()
        .map(ta -> t -> t.getColor().equals(ta.getCode()))
        .reduce(a -> false, Predicate::or);

如果流为空,您将获得一个默认情况下无法通过测试的谓词。将第一个参数更改为 reduce 以根据需要进行更改。

就我个人而言,我更喜欢创建一个谓词实例来根据颜色列表检查 SomeDto 实例。如果我正确理解你的代码,这应该是正确的:

Predicate<SomeDto> collect = dto -> somelistOfColors.stream()
               .anyMatch(ta -> dto.getColor().equals(ta.getCode()));

您确定需要谓词吗?看起来代码只是检查颜色列表是否包含 SomeDtos 代码。因此可以用搜索代替

SomeDto dto = //...
Arrays.stream(somelistOfColors)
    .map(color -> color.getCode())
    .anyMatch(t -> t.equals(dto.getColor()));