在现有 Java 7 代码中使用 Java 8 可选

2023-12-04

我有一项作业,需要将以下 Java 8 之前的代码转换为 Java 8 代码。以下只是一种让我很难完成的方法:

  public static List<VehicleMake> loadMatching(Region region, String nameStartsWith, VehicleLoader loader) {
    if ((nameStartsWith == null) || (region == null) || (loader == null)) {
        throw new IllegalArgumentException("The VehicleLoader and both region and nameStartsWith are required when loading VehicleMake matches");
    }
    List<VehicleMake> regionMakes = loader.getVehicleMakesByRegion(region.name());
    if (regionMakes == null) {
        return null;
    }
    List<VehicleMake> matches = new ArrayList<>(regionMakes.size());
    for (VehicleMake make : regionMakes) {
        if ((make.getName() == null) || !make.getName().startsWith(nameStartsWith)) {
            continue;
        }
        matches.add(make);
    }
    return matches;
}

我想通过使用删除空检查Optional<T>无需修改以前创建的类和接口。

我尝试首先更改方法返回类型并执行以下操作,但编译器抛出此错误:
Bad return type in method reference因为 VehicleMake 类没有可选的实例字段。
以下是我的代码尝试:

   public static Optional<List<VehicleMake>> loadMatchingJava8(Region region, String nameStartsWith, VehicleLoader loader) {
    Optional<List<VehicleMake>> regionMakes = Optional.ofNullable(loader).ifPresent(loader.getVehicleMakesByRegion(Optional.ofNullable(region).ifPresent(region.name())));
    /*

    TODO rest of the conversion
     */
}

编辑:删除了flatMap并通过不将参数传递给方法引用来更正代码。但现在它不让我通过region.name() to getVehicleMakesByRegion()

编辑:将消费者传递给ifPresent():

Optional<List<VehicleMake>> regionMakes = Optional.ofNullable(loader).ifPresent(()-> loader.getVehicleMakesByRegion(Optional.ofNullable(region).ifPresent(()->region.name()));

您可以更换您的初始null检查与

Optional.ofNullable(nameStartsWith)
        .flatMap(x -> Optional.ofNullable(region))
        .flatMap(x -> Optional.ofNullable(loader))
        .orElseThrow(() -> new IllegalArgumentException(
            "The VehicleLoader and both region and nameStartsWith"
          + " are required when loading VehicleMake matches"));

但这是对该 API 的滥用。更糟糕的是,它浪费了资源来实现在错误情况下提供相当无意义的异常的可疑目标。

与之比较

Objects.requireNonNull(region, "region is null");
Objects.requireNonNull(nameStartsWith, "nameStartsWith is null");
Objects.requireNonNull(loader, "loader is null");

它很简洁,并且会在错误情况下抛出带有精确消息的异常。这将是一个NullPointerException而不是一个IllegalArgumentException,但即使这样的改变也会导致对实际问题的更精确的描述。

关于该方法的其余部分,我强烈建议不要让Collections be null首先。然后,您不必测试结果getVehicleMakesByRegion for null并且不会回来null靠你自己。

然而,如果你必须坚持原来的逻辑,你可以使用

return Optional.ofNullable(loader.getVehicleMakesByRegion(region.name()))
               .map(regionMakes -> regionMakes.stream()
                    .filter(make -> Optional.ofNullable(make.getName())
                                            .filter(name->name.startsWith(nameStartsWith))
                                            .isPresent())
                    .collect(Collectors.toList()))
               .orElse(null);

初始代码的目的是reject null参考,不应与实际操作混淆,其目的是handle null参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在现有 Java 7 代码中使用 Java 8 可选 的相关文章

随机推荐

  • 以编程方式连接到配对的蓝牙设备

    有没有办法使用 Android SDK 以编程方式连接到已配对的蓝牙设备 换句话说 我可以进入 设置 gt 无线和网络 gt 蓝牙设置 然后点击设备 列为 已配对但未连接 此时它将连接 我希望能够以编程方式执行此操作 但没有找到一种方法来执
  • JPA/Hibernate 最大连接数?

    JPA Hibernate 查询中允许的联接数量是否有限制 自从休眠以来不会自动加入 我必须在 JPA Hibernate 查询中显式指定联接 例如 人有地址 地址有州 以下查询检索地址和状态已完全加载的人员 select p a s fr
  • 仅在 Woocommerce 中提供第二件商品的数量折扣

    我想为所有产品实现全球折扣 但仅限第二个产品项目 我是什么意思 如果顾客购买 夹克 则不享受折扣 客户购买了两件 夹克 产品 第二件 夹克 可享受 20 的折扣 客户购买了五件 夹克 产品 第二件 夹克 仍然只有20 的折扣 它应该适用于所
  • C# 如何通过编号分隔字符串 (1. 2. ...)

    我有这个字符串 1 This 2 Is 3 A 4 Test 并且想根据编号将其拆分 如下所示 1 这个 2 Is 3 A 4 测试 我认为这应该可以通过正则表达式实现 但不幸的是我对此不太了解 This string result Reg
  • StreamReader Read 方法未读取指定的字符数

    我必须解析一个大文件 所以不要这样做 string unparsedFile myStreamReader ReadToEnd takes 4 seconds parse unparsedFile takes another 4 secon
  • PHP 分页使用 glob 检索图像

    我正在尝试使用 glob 从文件夹中检索图像 并且希望对其进行分页 以便每页仅显示 3 个图像 通过在互联网和 S O 上进行挖掘我有下面的代码 问题是它只从目录中提取三个图像 当我单击下一页时 它会显示相同的 3 个图像 使用 glob
  • 类数据类型的 EasyMock 匹配器

    我对这个和 easymock 的语法做了噩梦 public void foo Class String class getClass 然而 当我拨打 foo String class 时 我得到 java lang IllegalState
  • Google表格公式:单元格范围内的子字符串求和

    我有两列 Col A Col B 01 02 2020 17 03 11 2020 24 03 11 2020 12 我尝试根据 A 列的子字符串对 B 列求和 如下所示 SUMIF A A MID A A 4 2 02 B B SUMIF
  • 如何使用时区格式化 url 日期时间参数

    我到处寻找但找不到答案 我想了解格式化日期时间 带时区 url 参数的方式 情况如下 调用程序具有带有 UTC 时区的 DateTime 值 接收器 Json WebAPI C 正在我的具有中央时区的本地电脑上运行 PoCreationDa
  • jMeter 中的 javax.net.ssl.SSLException

    我正在服务器上测试一些功能 直到昨天为止都运行良好 今天 他们已经启用了 ssl 到服务器 即从 http 到 https 现在 当我运行测试计划时 出现以下错误 我该如何解决这个问题 尽管我在请求中将协议值更改为 https 但我收到以下
  • SSL 证书未安装

    我在 IIS 中安装 SSL 证书时遇到问题 以下是从 CA 获取证书之前的步骤 使用 OpenSSL 生成私钥文件 openssl genrsa out key name key 2048 命令 生成的 csr 文件包含 openssl
  • 如何在 Windows 窗体中为标签添加边框?

    我正在尝试创建一个内部带有白色标签的表单 当我单击某些内容时 表单将消失并仅显示标签 到目前为止 我尝试将 TransparencyKey 放在 Lime 上 当我单击某些内容时 我将 BackColor 更改为 Lime 并将 FormB
  • Live555框架生成错误

    我正在尝试构建框架Live555图书馆 我从以下位置获取了库文件here按照这个SO的回答我已多次尝试根据该答案生成它 它只是给出以下错误 Applications Xcode app Contents Developer Platform
  • Spring Cloud Dataflow 类型转换在处理器组件中不起作用?

    我有一个可以转换的处理器byte 有效负载进入MyClass有效负载 Slf4j EnableBinding Processor class public class MyDecoder ServiceActivator inputChan
  • 如果 Observable 已完成,我是否需要取消订阅 Observable?

    假设我有一个Observable 热门 未完成 我订阅了它 通常当我完成时Subscription我必须取消订阅它以防止内存泄漏 let subject new Subject const sub subject subscribe Nee
  • 如何将 ObservableCollection 绑定到 WPF 中的复选框列表框

    让我先声明一下我对 C 和 WPF 都很陌生 我正在尝试连接一个集合Boolean值到包含 6 个复选框的容器 并在按下按钮时存储这些值的状态 我假设有一种简单的方法可以做到这一点 因为将复选框绑定到集合似乎是一件非常自然的事情 但到目前为
  • XSLT 将字段连接在一起

    我正在尝试过滤特定字段并连接另一个字段 Input
  • 如何使用Pivot_longer将宽类型数据重塑为具有多个变量的长类型数据

    我想问如何将以下数据框从宽类型重塑为长类型 宽类型数据如下 重塑前的宽类型数据 long 类型数据 即我想要获取的数据帧 如下所示 整形后的Long类型数据 如果您能给我使用更长的枢轴来完成此操作的提示 我将非常感激 我可以通过 BLS 和
  • 图表的中心

    给定一棵无向树 其无权边具有 N 个顶点和 N 1 个边 并且数量为 K 找到 K 个节点 以便树中的每个节点与 K 个节点中的至少一个节点的距离在 S 范围内 另外 S 必须是尽可能小的 S 因此 如果 S 我尝试解决这个问题 但是 我觉
  • 在现有 Java 7 代码中使用 Java 8 可选

    我有一项作业 需要将以下 Java 8 之前的代码转换为 Java 8 代码 以下只是一种让我很难完成的方法 public static List