Java 8:Comparator comparingDouble类型不匹配
leasttidx应该作为4返回,但我无法编译它。 任何见解都值得赞赏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(
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,可能正弦不是什么大问题,但在某些情况下,它可能是重要的,这取决于特定的键提取函数。