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

标签 java dictionary methods lambda java-8

好吧,我一直在试图找到这个问题的答案,但我就是无法理解新的 java 8 lambda 和方法引用。

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

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 中的 lambda 表达式和方法引用,但我就是不明白。不管怎样,我的最终想法是为每个内核提供一个字符串(内核名称)到方法的映射。然后将整个分类方法简化为:

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 和方法引用。

最佳答案

定义 map Map<String, BiFunction<FeatureVector, FeatureVector, Double>> functions ,添加您的功能,例如functions.put("linear", ThisClass::crossProduct)然后做

BiFunction<FeatureVector, FeatureVector, Double> function = functions.get(...); 
fx += xi.getWeight() * function.apply(xi, v);

如果 crossProduct 和 co.不是静态的,您需要执行 this::crossProduct相反。

关于java - Java 8 中字符串到方法的映射,传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28846178/

相关文章:

java - 使用 Scanner 库和 if 语句,简单的任务吗?

java - 当任何匹配值时返回匹配枚举

c++ - 在 map 上使用查找<pair, int>

javascript - javascript 中数字未从对象传递到方法

java - 如何从 FragmentActivity 向 Fragment 传递参数

java - 通过 Eclipse maven2 的 Pom/项目属性

java - 在java中使用map continue问题进行整数到单词的转换

javascript - 为什么标记在 mapbox 中不可见?

java - 如何将两个整数的数字相加?

Java方法最佳设计实践