当前位置: 首页 > 知识库问答 >
问题:

可选,有多个例外

班承恩
2023-03-14

我有下面的代码片段,我想用optionals重写

public User signup(UserDTO userDTO) throws Exception {
    User user = modelMapper.map(userDTO, User.class);
    
    if (userRepo.findByEmail(user.getEmail()).isPresent()) {
        throw new EmailAlreadyUsedException();
    }
    
    if (userRepo.findByUsername(user.getUsername()).isPresent()) {
        throw new UsernameAlreadyUsedException();
    }
    
    user.setId(UUID.randomUUID().toString());
    // set other stuff like encoded password
    userRepo.save(user);
}

使用optionals,我可以想出以下方法。

public User signup(UserDTO userDTO) throws Exception {
    return Optional.of(userDTO)
            .map(u -> modelMapper.map(u, User.class))
            .map(user -> {
                user.setId(UUID.randomUUID().toString());
                // set other stuff like encoded password

                // check email and username if they exist

                // save
                userRepo.save(user);
                return user;
            }).orElseThrow(Exception::new);
}

我被困在无法根据用户名和电子邮件引发特定异常的部分。如果其中一个已经存在于db中,我可以返回null,这将导致orElseThrow工作,但异常类型相同。我想要两个不同情况的例外。我该怎么办?

共有1个答案

杜楚
2023-03-14

我更喜欢更实用的可选用法。

问题是CheckedException的设计不是为了在Java上使用函数式。方法<代码>。可选的map接收一个不会引发异常的函数。只需将您的异常转换为RuntimeException的,即可按预期工作。

...但要小心实例化可丢弃文件(尤其是参数writableStackTrace,configure at false,应该可以),看看:实例化可丢弃文件的隐藏性能成本。

如果您对Java中的函数式编程方法感兴趣,也可以看看Vavr,它是一个非常好的库,支持CheckedException的选项。

 类似资料:
  • 问题内容: 我想为一组SQL查询创建一个过滤器,以便用户最多可以通过三个值过滤SQL SELECT。用户界面具有三个文本框,每个文本框都将绑定到SQL表中的列名。用户可以通过这些文本框提供一个,两个或三个条件。 到目前为止,这就是我所拥有的。我知道这些声明将不起作用,但是我找不到解决该问题的方法。(使用不会返回任何结果。 问题答案: 如果我正确遵循,您想根据所有填充变量过滤结果,以处理未填充变量,

  • 因此,为了提供搜索功能,我可以进行多个连接。我开始使用带有@query表示法的JPQL,但我必须对每个参数进行检查,结果一团糟。我开始研究其他选项,我看到了关于QueryDSL、标准和规范的东西,但我不确定我应该关注和学习哪一个。不幸的是,我不知道很多关于这个主题,我希望有人能指出我在正确的方向,以一个很好的实现这个搜索。谢谢!

  • 我试图创建一个JDialog框架,它将有一个背景图像和一个交互式JPanel。在这种情况下,JDialog将代表一个“战斗”领域,单位将能够被选择和移动。游戏是以太空为基础的,所以会有一个船的阵列列表,可能还有一个星球物体需要防御。 我已经能够重写paintComponent来绘制一个表示“行星”的粗糙圆圈,但无法获得要显示的背景JLabel图像。然后我可以显示背景JLabel,但看不到圆圈。理想

  • 问题内容: 静态变量只有实例(也就是说,它们是类的一部分)。例如:Math.pi 有什么办法可以有多个静态变量实例吗?我听说有一些与Classloader相关的东西吗? 问题答案: 如果发现需要一个静态变量的多个实例,则强烈表明您不应该首先使用静态变量。 是的,如果同一类加载到不同的类加载器中,则该类的每个副本将具有其自己的静态变量。但是,唯一可以静态引用这些静态变量的代码将是由同一类加载器加载的

  • 主要内容:Struts2 <s:checkboxlist> 示例,1. 动作 - Action,2. 结果页面,3. struts.xml,5. 实例,参考这里创建一个Web工程:struts2checkboxlist,来演示在多个复选框如何设置的默认值,整个项目的结构如下图所示: 在Struts2,可以使用<s:checkboxlist>标签来使用相同的名称来创建多个复选框。唯一的问题是如何把握变量中的多个检查值? 例如, 一个多复选框以“红”,“黄”,“蓝”和“绿色”为选项。如果有多个选项被