Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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中字符串到方法的映射,传递参数_Java_Dictionary_Methods_Lambda_Java 8 - Fatal编程技术网

Java 8中字符串到方法的映射,传递参数

Java 8中字符串到方法的映射,传递参数,java,dictionary,methods,lambda,java-8,Java,Dictionary,Methods,Lambda,Java 8,好的,我一直在试图找到这个问题的答案,但我无法理解新的Java8Lambda和方法引用 我正在写一个SVM解码器。我有一个由libSVM创建的模型,可以得到所有相关信息,比如内核类型和常量,比如rho和gamma。我有一个函数,它接受一个向量,并使用模型的内核类型对它进行分类。目前,我只是使用一个开关来确定要使用哪个内核: public double classify(FeatureVector v){ double fx = 0.0; switch(kernel){

好的,我一直在试图找到这个问题的答案,但我无法理解新的Java8Lambda和方法引用

我正在写一个SVM解码器。我有一个由libSVM创建的模型,可以得到所有相关信息,比如内核类型和常量,比如rho和gamma。我有一个函数,它接受一个向量,并使用模型的内核类型对它进行分类。目前,我只是使用一个开关来确定要使用哪个内核:

public double classify(FeatureVector v){
    double fx = 0.0;

    switch(kernel){
        case "linear":
            for(FeatureVector xi : supportVectors){
                fx += (xi.getWeight() * crossProduct(xi, v));
            }

            break;
        case "polynomial":
            for(FeatureVector xi : supportVectors){
                fx += (xi.getWeight() * polynomialKernel(xi, v));
            }

            break;
        case "rbf":
            for(FeatureVector xi : supportVectors){
                fx += (xi.getWeight() * rbfKernel(xi, v));
            }

            break;
        case "sigmoid":
            for(FeatureVector xi : supportVectors){
                fx += (xi.getWeight() * sigmoidKernel(xi, v));
            }

            break;
        default:
            break;
    }

    return fx - rho;
}
现在,这个很好用。但这很难看,也很难理解。我一直在阅读第8章中的lambdas和方法引用,但我就是搞不懂。无论如何,我的最终想法是将字符串(内核名称)映射到每个内核的方法。然后将整个分类方法简化为:

public double classify(FeatureVector v){
    double fx = 0.0;
    //get the method from map, this is where I need the help

    for(FeatureVector xi : supportVectors){
        //and how do I then pass params to the method?
        fx += (xi.getWeight() * kernelMethod(xi, v));
    }
    return fx - rho;
}
可能还有一种方法可以使用streams来完成每个循环的整个过程,但首先我想了解lambda和方法引用。

定义映射
映射函数,添加函数,例如
函数。put(“linear”,ThisClass::crossProduct)
,然后执行

BiFunction<FeatureVector, FeatureVector, Double> function = functions.get(...); 
fx += xi.getWeight() * function.apply(xi, v);
BiFunction=functions.get(…);
FX+=席席GETWebLead()*函数。

如果crossProduct和co.不是静态的,您需要改为执行
this::crossProduct

不要仅仅为了使用
lambda而使用
lambda

我会像这样简单地重构您的代码:

for(FeatureVector xi : supportVectors)
{
    switch(kernel){
        case "linear":
            fx += (xi.getWeight() * crossProduct(xi, v));
            break;
        case "polynomial":
            fx += (xi.getWeight() * polynomialKernel(xi, v));
            break;
        case "rbf":
            fx += (xi.getWeight() * rbfKernel(xi, v));
            break;
        case "sigmoid":
            fx += (xi.getWeight() * sigmoidKernel(xi, v));
            break; 
    }
}

您可能希望阅读有关避免这种切换语句的文章,这种语句很可能会随着时间的推移而变得越来越严重。

我认为您不需要lambdas来实现这一点。您可以使用多态性或简单的
开关
。谢谢!现在这有点道理了。