繁体   English   中英

java 8 中的可选保持从类返回 toString 方法

[英]Optional in java 8 keep returning toString method from class

我对库java.util.Optional.ofNullable; Java 8 有疑问java.util.Optional.ofNullable; 我已经编写了以下代码,但我希望它会返回类字段的值。 但是我一直在从课堂上获取 toString 方法。 执行此代码的原因可能是什么。

import static java.util.Optional.ofNullable;

public class Main12 {

    public static String getName(User user){
        return ofNullable(user).map(User::getName).orElse("noFound");
    }

    public static void main(String[] args) {
        User user = new User();
        user.setName("ew");
        System.out.println(user);
    }

}

我从终端得到的结果是User{id=null, name='ew', age=0, roles=[]} 。我希望我能从 User 类中获得 name 字段的值。

public class User {
    private Long id;
    private String name;
    private int age;
    private Set<Role> roles = new HashSet<>();

    public User(long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public User(){

    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", roles=" + roles +
                '}';
    }
}

用户类字段和方法。 当我从 Main12 类向方法 getName 发送 null 参数时。 我会得到空字符串,但是来自 ofNullable 的 orElse 不会对我在那里写的内容做出反应。 如果您知道如何修复它,请告诉我。我永远不会得到 noFound String 或 Class 字段值的真实名称。

public static string getName(User user)与您在User类中定义的方法getName无关。 其实它们完全不同

因此,在main方法中,您甚至不会在内部调用带有 Optionals 的静态getName方法 - 因此它甚至不会运行。

现在,调用toString是因为您调用System.out.println(user) 在这种情况下,Java 会自动调用toString 这就是发生的事情。

Optional.ofNullable会将对该对象的引用(即使它为空)“包装”到 Optional 包装器中。

我知道,这可能是评论而不是答案,但评论太长了。

您没有在任何地方调用您在main之上定义的静态方法。 您可以在 User 类中执行以下操作:

public String getName() {
    return Optional.ofNullable(name).orElse("noFound");
}

我必须声明,这不是一个好的做法。 如果name真的是可选的,它应该默认为一些合理的,就像你的Set一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM