Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8:Comparator comparingDouble类型不匹配_Java_Java 8_Comparator_Java Stream - Fatal编程技术网

Java 8:Comparator comparingDouble类型不匹配

Java 8:Comparator comparingDouble类型不匹配,java,java-8,comparator,java-stream,Java,Java 8,Comparator,Java Stream,leasttidx应该作为4返回,但我无法编译它。 任何见解都值得赞赏 final int[] brr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; for (int i : brr) { System.out.println(Math.sin(i)); } final int leastIdx = Arrays.stream(brr).min(Comparator.comparingDouble(i -> Math.sin(i))).get(

leasttidx应该作为4返回,但我无法编译它。 任何见解都值得赞赏

final int[] brr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };

for (int i : brr) {
    System.out.println(Math.sin(i));
}

final int leastIdx = Arrays.stream(brr).min(Comparator.comparingDouble(i -> Math.sin(i))).get();
类型IntStream中的方法min()不适用于
参数(Comparator.comparingDouble((i)->Math.sin(i)))
IntStream#min
不使用比较器;它只找到流中最小的
int
。您必须转换为

或使用
reduce
计算最小值:

Arrays.stream(brr).boxed()
        .min(comparingDouble(i -> Math.sin(i)))
        .get();
leasttidx应作为4返回

您的流实际上是在试图用最小的
Math.sin
查找
int
,而不是该
int
的索引。如果要查找索引,则需要对索引而不是值进行流式处理:

Arrays.stream(brr)
        .reduce((x,y) -> Math.sin(x) > Math.sin(y) ? y : x )
        .getAsInt();
或者,如果您愿意牺牲清晰度来避免拳击:

int leastIdx = IntStream.range(0, brr.length).boxed()
        .min(comparingDouble(i->Math.sin(brr[i])))
        .get();
IntStream#min
不使用比较器;它只找到流中最小的
int
。您必须转换为

或使用
reduce
计算最小值:

Arrays.stream(brr).boxed()
        .min(comparingDouble(i -> Math.sin(i)))
        .get();
leasttidx应作为4返回

您的流实际上是在试图用最小的
Math.sin
查找
int
,而不是该
int
的索引。如果要查找索引,则需要对索引而不是值进行流式处理:

Arrays.stream(brr)
        .reduce((x,y) -> Math.sin(x) > Math.sin(y) ? y : x )
        .getAsInt();
或者,如果您愿意牺牲清晰度来避免拳击:

int leastIdx = IntStream.range(0, brr.length).boxed()
        .min(comparingDouble(i->Math.sin(brr[i])))
        .get();

提出的解决方案有一个缺陷:它们对几乎每个元素计算两次正弦。因此,对于1000个输入元素,必须计算大约2000次正弦

有两种解决方案涉及到我的库,它们精确地计算每个流元素的正弦值一次:

int leastIdx = IntStream.range(0, brr.length)
        .reduce((x,y) -> Math.sin(brr[x]) > Math.sin(brr[y]) ? y : x)
        .getAsInt();
或者:

final int leastIdx = IntStreamEx
        .ofIndices(brr).boxed()
        .minByDouble(i -> Math.sin(brr[i])).get();

两者都在输入时返回4。不幸的是,目前这两个项目都涉及拳击。目前,StreamEx没有提供消除装箱和两次正弦计算的方法。

建议的解决方案有一个缺陷:它们几乎对每个元素计算两次正弦。因此,对于1000个输入元素,必须计算大约2000次正弦

有两种解决方案涉及到我的库,它们精确地计算每个流元素的正弦值一次:

int leastIdx = IntStream.range(0, brr.length)
        .reduce((x,y) -> Math.sin(brr[x]) > Math.sin(brr[y]) ? y : x)
        .getAsInt();
或者:

final int leastIdx = IntStreamEx
        .ofIndices(brr).boxed()
        .minByDouble(i -> Math.sin(brr[i])).get();

两者都在输入时返回4。不幸的是,目前这两个项目都涉及拳击。目前,StreamEx没有提供消除装箱和两次正弦计算的方法。

除非探查器告诉我计算
sin
两次是个问题,否则我不会在意。它不太可能得到优化。@Holger,可能正弦不是什么大问题,但在某些情况下,它可能是重要的,这取决于特定的键提取函数。除非探查器告诉我计算两次sin是个问题,否则我不会在意。它不太可能得到优化。@Holger,可能正弦不是什么大问题,但在某些情况下,它可能是重要的,这取决于特定的键提取函数。