Java 8中字符串到方法的映射,传递参数
好的,我一直在试图找到这个问题的答案,但我无法理解新的Java8Lambda和方法引用 我正在写一个SVM解码器。我有一个由libSVM创建的模型,可以得到所有相关信息,比如内核类型和常量,比如rho和gamma。我有一个函数,它接受一个向量,并使用模型的内核类型对它进行分类。目前,我只是使用一个开关来确定要使用哪个内核: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){
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来实现这一点。您可以使用多态性或简单的开关
。谢谢!现在这有点道理了。