gpt4 book ai didi

java - 在现有 Java 7 代码中使用 Java 8 Optional

转载 作者:行者123 更新时间:2023-11-30 06:06:35 25 4
gpt4 key购买 nike

我有一项作业需要将以下 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> 删除空检查无需修改先前创建的类和接口(interface)。

我尝试首先更改方法返回类型并执行以下操作,但编译器抛出此错误:
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()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,但即使是这样的变化也会导致对实际问题的更准确描述。

关于该方法的其余部分,我强烈建议首先不要让 Collectionnull。然后,您不必测试 getVehicleMakesByRegion 的结果是否为 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);

旨在拒绝 null 引用的初始代码不应与旨在处理 null 引用。

关于java - 在现有 Java 7 代码中使用 Java 8 Optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43751613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com