【问题标题】:Java 8 Creating list of predicates from another list [duplicate]Java 8从另一个列表创建谓词列表[重复]
【发布时间】:2021-05-14 07:34:48
【问题描述】:

我正在编写下面的代码,但它似乎很尴尬。能不能写得更好?最后,代码必须创建一个谓词,该谓词由带有 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));
}

【问题讨论】:

    标签: java java-stream predicate


    【解决方案1】:

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

    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()));
    

    【讨论】:

    • 你的建议看起来对 OPs 问题更实用
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2021-09-18
      • 2016-05-18
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多