Java 寻找参数范围内的函数最小值

Java 寻找参数范围内的函数最小值,java,lambda,java-8,Java,Lambda,Java 8,让我们假设我有: int x = 5; int y = 10; 和一个带签名的函数 public double CalculateEntropySplittingOnFeature(List<Sample> samples, int cutOffPoint) public双重计算属性分割特征(列出示例,int截止点) 我想找出函数中包含的5到0之间的哪个整数值返回的值最小。我的解决方案: ((List <Integer>) IntStream.range(x, y

让我们假设我有:

int x = 5;
int y = 10;
和一个带签名的函数

public double CalculateEntropySplittingOnFeature(List<Sample> samples, int cutOffPoint) 
public双重计算属性分割特征(列出示例,int截止点)
我想找出函数中包含的5到0之间的哪个整数值返回的值最小。我的解决方案:

((List <Integer>) IntStream.range(x, y))
                .stream()
                .min(new Comparator<Integer>() {
                    @Override
                    public int compare(Integer o1, Integer o2) {
                        return Double.compare(CalculateEntropySplittingOnFeature(samples, o2), CalculateEntropySplittingOnFeature(samples, o1));
                    }
                });
((列表)IntStream.range(x,y))
.stream()
.min(新比较器(){
@凌驾
公共整数比较(整数o1,整数o2){
返回Double.compare(CalculateEntropySplitingInfecture(样本,o2),CalculateEntropySplitingInfecture(样本,o1));
}
});
但是,我觉得有一个更好/更优雅(/高效)的解决方案,而不是生成一个IntStream并将其强制转换为list,然后再次进行流式处理。。。有什么建议吗?

((List)IntStream.range(x,y))
将抛出
ClassCastException
,因为
IntStream
不实现
List

使用

要获取

编辑:

Optional<Integer> min =
    IntStream.range(x, y)
             .boxed ()
             .min ((o1,o2)->Double.compare(CalculateEntropySplittingOnFeature(samples, o2), 
                     CalculateEntropySplittingOnFeature(samples, o1)));
可选最小值=
IntStream.range(x,y)
.装箱()
.min((o1,o2)->双重比较(计算温度分层特征(样品,o2),
计算取向分裂特征(样本,o1));

您在评论中要求提供风格建议。我建议:

Optional<Integer> lowest = IntStream.range(0, 5).boxed()
    .min(Comparator.comparingDouble(n -> calcEntropySplittingOnFeatures(samples, n)));
Optional lower=IntStream.range(0,5).boxed()
.min(Comparator.comparingDouble(n->CalcentropySplitingInfectures(samples,n)));

正如其他答案所述,您可以通过调用
boxed()
IntStream
转换为
Stream
。但是,当你认为<代码> min(比较器)只是<代码> Read(BialActudio.Min(比较器))的快捷方式时,可以进行不装箱的操作。您可以对
int
值重新执行相同的操作:

OptionalInt result=IntStream.range(x, y).reduce((a,b)->
    CalculateEntropySplittingOnFeature(samples, a)<=
    CalculateEntropySplittingOnFeature(samples, b)? a: b);
并将其用作

OptionalInt result=IntStream.range(x, y)
    .reduce(minBy(i -> CalculateEntropySplittingOnFeature(samples, i)));

这似乎已经完成了,谢谢:)总的来说-对我的风格/方法有什么评论吗?@DarioMan好吧,你可以通过使用lambda表达式而不是匿名比较器实现来节省一些输入。
.min(Comparator.comparingDouble(o->calculateEntropySplitingFeature(samples,o))
请记住“不要重复你自己”的原则…
public static IntBinaryOperator minBy(IntToDoubleFunction f) {
    return (a,b) -> f.applyAsDouble(a)<=f.applyAsDouble(b)? a: b;
}
OptionalInt result=IntStream.range(x, y)
    .reduce(minBy(i -> CalculateEntropySplittingOnFeature(samples, i)));