如何使用流设置对象的 属性

How to Set an Object's Property using Streams

我正在流式传输和过滤值。有什么办法可以在过滤器之后设置另一个对象值。我不想收集或 return 任何东西。

boolean b = ddlTables.stream()
    .filter(d -> d.getFieldName().equalsIgnoreCase("restrict"))
    .findFirst()
    .isPresent();

if (b) {
    validationModel.setFailMessage("Fail");
}

我不想按照上面的方式去做。

我试图避免 return 和 if 条件并设置如下值。

ddlTables.stream()
    .filter(d -> d.getFieldName().equalsIgnoreCase("restrict"))
    //  validationModel.setFailMessage("failed"); <- Need to set the object value 

有什么办法可以实现吗?

Stream API documentation.

不鼓励更改流外对象的状态

但是您可以利用 Optional class 提供的功能。

方法 Optional.ifPresent() 允许以 Consumer 的形式提供一个可选操作,该操作将在结果出现时执行。

将 stream-statement 提取到一个单独的方法中也是值得的( 没有什么特定于流 - 只是 Single-responsibility principle)。

final Model validationModel = // something

findByProperty(ddlTables, "restrict")
    .ifPresent(something -> validationModel.setFailMessage("Fail"));
public static Optional<Something> findByProperty(List<Something> list, String targetValue) {
    return list.stream()
        .filter(d -> d.getFieldName().equalsIgnoreCase(targetValue))
        .findFirst();
}

A link to Online Demo

我唯一能提供的就是这个。它使用 isPresent 方法的结果来形成逻辑表达式。但是您必须始终 return 来自流的内容或使用触发值流的终端操作打印值。让我重申一下,您的第一种方法很好,我也会这样做。

if (ddlTables.stream().filter(d-> 
           d.getFieldName().equalsIgnoreCase("restrict")).findFirst().isPresent()) {
                            validationModel.setFailMessage("Fail");
}