Arg-min使用整数流

时间:2017-12-01 02:20:36

标签: concurrency java-8 java-stream

我想使用Java流找到函数sin(i / 100)最小的整数i,其范围为{1,... 1000}。我尝试将min与比较器一起使用,如this question

    Comparator<Integer> sineComparator = (i,j) -> 
        Double.compare(Math.sin(i/100.0), Math.sin(j/100.0));
    IntStream.range(1,1000)
    .min(sineComparator);

但由于IntStream没有接受比较器的min变量,所以它不起作用。我该怎么办?

1 个答案:

答案 0 :(得分:4)

您必须使用boxed()IntStream转换为Stream<Integer>,这样您就可以将min与比较器一起使用:

IntStream.range(1, 1000)
            .boxed()
            .min(sineComparator)

或者,您可以避免拳击,但代价是降低清晰度:

IntStream.range(1,1000)
            .reduce((i,j) -> sineComparator.compare(i, j) <= 0 ? i : j)

另外,您可以使用Comparator.comparingDouble创建比较器:

Comparator<Integer> sineComparator = Comparator.comparingDouble(i -> Math.sin(i/100.0));