java - 如果stream().filter为空

标签 java spring spring-boot java-stream option-type

我想知道如果过滤器没有找到值并找到它,如何从流中执行代码,示例代码:

 @Transactional
public void change(ClassName dep){
    // code
    dep.getFoo()
            .stream()
            .filter(f -> f.getName().equals(doo.getName))
            
}

如果过滤器有一个值,则:

user.setFoo(f);

如果过滤器中没有值,则:

Foo foo = new Foo();
foo.setName("Exp");
user.setFoo(foo);

最佳答案

我建议为 Foo 创建一个接受 name 的构造函数。

然后您可以使用默认值可选提取名称:

Foo foo = dep.getFoo()
        .stream()
        .filter(f -> f.getName().equals(doo.getName))
        .findAny().orElse(new Foo("Exp"));
user.setFoo(foo);

Holger 巧妙地注意到,如果 Optional 不为空,则使用 orElseGet 可以避免执行 Supplier(如果计算复杂或发生副作用):

Foo foo = dep.getFoo()
        .stream()
        .filter(f -> f.getName().equals(doo.getName))
        .findAny().orElseGet(() -> new Foo("Exp"));
user.setFoo(foo);

从 java 11 开始,您可以使用 ifPresentOrElse:

dep.getFoo()
        .stream()
        .filter(f -> f.getName().equals(doo.getName))
        .findAny()
        .ifPresentOrElse(user::setFoo, () -> user.setFoo(new Foo("Exp")));

P.S.:如果您无法创建构造函数,您可以只创建提供它的方法并在上面的代码片段中使用它:

public static Foo defaultFoo() {
    Foo foo = new Foo();
    foo.setName("Exp");
    return foo;
}

关于java - 如果stream().filter为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71263430/

相关文章:

java - 控制结构,重复练习: How to get the sum of the digits of a number?

java - 获取第一个值 TreeMultiMap

使用 JSON 响应进行 spring 安全错误处理

spring-boot - 从数据库获取数据时,Jpa Repository 出现错误无法序列化

java - Spring Boot - 使用自定义对象数组 JSON 序列化自定义对象

java - 仅使用 AWS 免费套餐的 Spring Boot 项目

java - Spring security - 禁用注销重定向

带有 spring.config.location 的 Spring

spring-boot - 如果由于消费者处理消息时出错而未发送手动确认,那么如何以及何时重新传递 Kafka 消息?

java - 获取详细的 json 响应(没有 id 引用,始终是实例)