Java 8:比较器比较双类型不匹配

时间:2015-07-22 02:56:00

标签: java java-8 comparator java-stream

a='hello world'
map(lambda x:x, a)

leastIdx应该返回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();

2 个答案:

答案 0 :(得分:4)

IntStream#min没有拿比较器;它只是在流中找到最小的int。您必须转换为Stream<Integer>

Arrays.stream(brr).boxed()
        .min(comparingDouble(i -> Math.sin(i)))
        .get();

或使用reduce计算分钟:

Arrays.stream(brr)
        .reduce((x,y) -> Math.sin(x) > Math.sin(y) ? y : x )
        .getAsInt();
  

leastIdx应该返回为4

您的信息流实际上是在尝试查找int最小的Math.sin,而不是int的索引。如果要查找索引,则需要流式传输索引而不是值:

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

或者,如果你愿意牺牲清晰度来避免拳击:

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

答案 1 :(得分:2)

建议的解决方案有一个缺陷:他们几乎每个元素都计算两次正弦值。因此,对于1000个输入元素,您将需要计算约2000次正弦值。

我的StreamEx库有两个解决方案,每个流元素只计算一次正弦值:

itertools

或者:

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

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