[英]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.