【问题标题】:Is it possible to change all Guava API with the Java 8 API?是否可以使用 Java 8 API 更改所有 Guava API?
【发布时间】:2020-12-10 17:36:33
【问题描述】:

我的项目刚跑了声纳扫描,发现了1个报告案例,分别是:

Sonar 建议使用 Java 8 API 而不是 Guava API。

在某些情况下,我可以更改 API,但我发现在某些情况下,我找不到对应的 Java 8 替换 Guava。

例如:

import java.util.Optional;
import static com.google.common.base.Preconditions.checkNotNull;

Optional<String> proxyHost;
this.proxyHost = checkNotNull(proxyHost, "proxyHost is required")
                .orNull(); // this line will having compilation error orNull method undefined.

我正在尝试在 Java 8 API 中找到一个替代品来替代 Guava checkNotNull,但看起来 Java 8 没有它。而这只是其中的一个例子。

我也找不到以下 sn-p 的替代品:

import com.google.common.collect.Iterables.tryFind;
import com.google.common.base.Suppliers;

等等。

我可以在某处找到 Java 8 替代 API 吗?或者我应该在声纳扫描中将此案例掩盖为误报?

【问题讨论】:

  • 当你使用 Optional 时,你可以像 proxyHost.orElse(null)proxyHost.orElseThrow(...) 那样做

标签: java api java-8 sonarqube guava


【解决方案1】:

你可以这样写 对于抛出错误,您可以使用如下。

proxyHost.orElseThrow(() -&gt; new Exception("proxyHost is required"));

或者设置默认你可以试试

String result=proxyHost.isPresent()?proxyHost.get():"proxyHost is required";

【讨论】:

  • checkNotNull 的第二个参数是错误信息,而不是默认使用。
  • 请参阅orElseThrow 了解如何调用该 API。编译的代码可以提供更好的答案。
  • @Joe 我只是在给他提示,我已经添加了带有异常的确切代码。
【解决方案2】:

具体可以用来代替Preconditions.checkNotNull(T) 的Java 8 API 是Objects.requireNonNull(T)。但是,在您的情况下,您有一个 Optional 实例,因此您可能不想检查您的变量是否为 null,但它是否为非空。这可以通过Optional.orElseThrow 完成,如下所示:

this.proxyHost = proxyHost.orElseThrow(() -> new SomeExceptionClass("proxyHost is required"));

Iterables 类的 Guava 文档规定,在许多使用 Iterables 的情况下,您可以改用 Java 8 Streams。

对于 Suppliers 类,我不知道 Java 8 Supplier 实例的直接等效项。

【讨论】:

    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    相关资源
    最近更新 更多