首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VAVR (选项).of()不能正常工作

VAVR (选项).of()不能正常工作
EN

Stack Overflow用户
提问于 2022-06-21 10:45:05
回答 1查看 158关注 0票数 2

我试图在我的Java应用程序中探索Vavr库的使用。我正在尝试使用Vavr库的Match.of()构造来减少if-else梯子。

下面是我编写的一段代码:

代码语言:javascript
复制
Match(Option.of(clientId)).of(
                Case($None(), run(() -> {
                    metricsService.recordValidationStageMetrics(CLIENT_ID_NOT_PRESENT, type, BLANK);
                    log.error("Client ID not present in the request header: [{}]", clientId);
                    throw new ValidationException(EX_REQUEST_CLIENT_ID_EMPTY);
                })),
                Case($Some($(StringUtils::isBlank)), run(() -> {
                    metricsService.recordValidationStageMetrics(CLIENT_ID_NOT_PRESENT, type, BLANK);
                    log.error("Client ID not present in the request header: [{}]", clientId);
                    throw new ValidationException(EX_REQUEST_CLIENT_ID_EMPTY);
                })),
                Case($(), run(() -> {
                    if (isClientIdNotAllowed(clientId)) {
                        log.error(LOG_CLIENT_ID_NOT_ALLOWED, clientId);
                        metricsService.recordValidationStageMetrics(CLIENT_ID_NOT_ALLOWED, type, clientId);
                        throw new ValidationException(EX_ALLOWED_CLIENT_ID_ERROR);
                    }
                }))
        );

这里的问题是,Option总是匹配第一个Case语句。即使clientId是非空的,它也被验证为None并抛出异常。

所以问题是:

  1. ,为什么它的行为不是故意的呢?我在这里错过了什么?
  2. 有没有更干净的方法来写这个?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-22 13:30:55

实际上--就我所记得的--您需要在run前面加上() ->,这表示使用的Case的第二个参数的Supplier变体。否则,将急切地对其进行评估,因此将运行第一个Case

以下代码工作正常:

代码语言:javascript
复制
package lol;

import static io.vavr.API.$;
import static io.vavr.API.Case;
import static io.vavr.API.Match;
import static io.vavr.API.run;
import static io.vavr.Patterns.$None;
import static io.vavr.Patterns.$Some;

import io.vavr.control.Option;

public class Lol {

  public static void main(String[] args) {
    String val = "lol";
    Match(Option.of(val)).of(
        Case($None(), () -> run(() -> {
          System.out.println(1);
          throw new IllegalArgumentException("null");
        })),
        Case($Some($(String::isEmpty)), () -> run(() -> {
          System.out.println(2);
          throw new IllegalArgumentException("empty");
        })),
        Case($(), () -> run(() -> {
          System.out.println(3);
          if ("lol".equals(val)) {
            throw new IllegalArgumentException("lol");
          }
        }))
    )
    ;
  }
}

尝试删除() ->,无论输入是什么,您都将开始获得匹配的第一个Case

我能不能写得更干净。这取决于您使用的java版本。如果使用最新版本,我将其视为一个switch语句或模式匹配。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72699405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档