【发布时间】:2015-03-04 03:26:21
【问题描述】:
好的,我一直在努力寻找这个问题的答案,但我无法理解新的 java 8 lambda 和方法引用。
我正在编写一个 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 和 Method references,但我就是想不通。无论如何,我的最终想法是为每个内核创建一个字符串映射(内核名称)到方法。然后将整个分类方法简化为:
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;
}
可能还有一种使用流的方法来执行整个 for-each 循环,但首先我想了解 lambda 和方法引用。
【问题讨论】:
-
我认为你不需要 lambdas。您可以使用多态性或简单的
switch。
标签: java dictionary methods lambda java-8