【问题标题】:Throwing a custom exception with lambda expression in java在 java 中使用 lambda 表达式引发自定义异常
【发布时间】:2021-03-13 19:23:03
【问题描述】:

我环顾了一会儿,但似乎找不到正确的答案。 因为我有一个项目并且想要使用 lambda 表达式,所以我正在尝试减少我的代码。我是 lambda 的新手并且仍在练习它,我在一般情况下遇到了 lambda 的“异常处理”,但是,对于我的具体问题,我似乎找不到。

我有一个完整的项目要修复,但这里有一个我想减少的代码示例。

代码:

for (Customer allCustomers : cust.getAllCustomers()) {
    if (customer.getEmail().equals(allCustomers.getEmail()))
        throw new CustomerAlreadyExists(
                "ERROR: Cannot add customer. email is already in use.");

}

我尝试过的:

cust.getAllCustomers()
    .stream()
    .filter(x -> x.getEmail().equals(customer.getEmail())
    .forEach(throw new CustomerAlreadyExists(
            "ERROR: Cannot add customer. email is already in use."));

我的问题似乎与抛出异常有关。 (不会编译)否则我认为表达式很好。 有没有办法用一个衬里抛出异常?

谢谢。还在学习中。

【问题讨论】:

  • Iterable.forEach 采用Consumer,其accept 方法没有任何声明的检查异常。如果CustomerAlreadyExists 是运行时异常,您的代码将起作用。如果需要抛出已检查异常,请通读How can I throw CHECKED exceptions from inside Java 8 streams?
  • "我的问题似乎是抛出异常。" - 这是什么意思?它不编译吗?它的行为不符合预期吗?我会采取不同的方法:流,过滤,先查找,映射到异常(不要抛出它),检查存在,如果存在则抛出。但是,这不会是单行的。

标签: java exception lambda java-stream


【解决方案1】:

我会以不同的方式处理问题,并且更符合抛出异常。

  1. 否定过滤条件
  2. 使用findAny()orElseThrow()

cust.getAllCustomers()
    .stream()
    .map(Customer::getEmail)
    .filter(Predicate.not(customer.getEmail()::equals))
    .findAny()
    .orElseThrow(() -> throw new CustomerAlreadyExists(
            "ERROR: Cannot add customer. email is already in use."));

【讨论】:

    【解决方案2】:

    你可以这样做:

    cust.getAllCustomers().stream()
        .filter(x -> x.getEmail().equals(customer.getEmail())
        .forEach(s -> {throw new CustomerAlreadyExists("ERROR: Cannot add customer. email is already in use.");});
    

    【讨论】:

    • 谢谢。这似乎解决了这个问题,但是我希望有一个衬里,因为不可能我就用这个。
    【解决方案3】:

    这是一个迟到的答案,但也许值得使用Stream::anyMatch 来检查条件:

    String email = customer.getEmail();
    if (cust.getAllCustomers()
        .stream()
        .map(Customer::getEmail)
        .anyMatch(email::equals)) {
        throw new CustomerAlreadyExists("ERROR: Cannot add customer. email is already in use.")
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      相关资源
      最近更新 更多