简体   繁体   English

Double::isFinite 与 Double::isInfinite 有何不同?

[英]How is Double::isFinite different from Double::isInfinite?

I have the following code:我有以下代码:

class Result {
    public Result(long infiniteCount, DoubleSummaryStatistics statistics) {
        this.infiniteCount = infiniteCount;
        this.statistics = statistics;
    }
    final long infiniteCount;
    final DoubleSummaryStatistics statistics;
}

This compiles:这编译:

Result result = DoubleStream.of(1.0, 2.0, 3.0).boxed().collect(Collectors.teeing(
        Collectors.filtering(Double::isFinite, Collectors.counting()),
        Collectors.filtering(Double::isFinite, Collectors.summarizingDouble(d -> d)),
        Result::new));

This doesn't:这不是:

Result result = DoubleStream.of(1.0, 2.0, 3.0).boxed().collect(Collectors.teeing(
        Collectors.filtering(Double::isInfinite, Collectors.counting()),
        Collectors.filtering(Double::isFinite, Collectors.summarizingDouble(d -> d)),
        Result::new));

Compilation results in this:编译结果如下:

java: incompatible types: cannot infer type-variable(s) T,A,R,capture#1 of?,T (argument mismatch; invalid method reference reference to isInfinite is ambiguous both method isInfinite(double) in java.lang.Double and method isInfinite() in java.lang.Double match) java:类型不兼容:无法推断类型变量 T,A,R,capture#1 of?,T(参数不匹配;对 isInfinite 的无效方法引用引用不明确,两种方法 isInfinite(double) in java.lang.Double和方法 isInfinite() in java.lang.Double match)

Here is the source code of these 2 methods from Double.java of Java 19... I don't understand why is there difference... (AFAIK @IntrinsicCandidate shouldn't affect this, and otherwise it's just two methods that return a boolean).这是来自 Double.java of Java 19 的这两种方法的源代码...我不明白为什么会有差异...(AFAIK @IntrinsicCandidate不应该影响这个,否则它只是返回 a 的两种方法布尔值)。

@IntrinsicCandidate
public static boolean isInfinite(double v) {
    return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}

public static boolean isFinite(double d) {
    return Math.abs(d) <= Double.MAX_VALUE;
}

So, why does the first compile and the second doesn't...?那么,为什么第一个编译而第二个不编译......?

You are missing the non-static Double.isInfinite() method:您缺少非静态Double.isInfinite()方法:

public boolean isInfinite() {
    return isInfinite(value);
}

This makes Double::isInfinite ambiguous as both methods match.这使得Double::isInfinite模棱两可,因为两种方法都匹配。 You could use a lambda to disambiguate it:您可以使用 lambda 来消除歧义:

Collectors.filtering(d -> d.isInfinite(), Collectors.counting())

isInfinite exists as static and instance method: isInfinite存在为 static 和实例方法:

  • static boolean isInfinite(double d)
  • boolean isInfinite()

Your method reference becomes ambiguous.您的方法参考变得不明确。 By converting to a lambda, you can disambiguate:通过转换为 lambda,您可以消除歧义:

Result result = DoubleStream.of(1.0, 2.0, 3.0).boxed().collect(Collectors.teeing(
        Collectors.filtering(d -> d.isInfinite(), Collectors.counting()),
        Collectors.filtering(Double::isFinite, Collectors.summarizingDouble(d -> d)),
        Result::new));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM