2014-06-10 31 views
2

在Java参数定义的操作,我想定义归一化函数,它一个数字作为输入,但其行为是由多个参数定义。通功能在Java

从本质上讲,相当于Java的这种Lisp中:

(define (normalizeVal min max floor ceiling) 
    (lambda (x) (/ (* (- ceiling floor) (- x min)) (+ (- max min) floor)))) 

在伪代码,我想:

function parsing(data, normalizeValFunc) { 
    for (datum in data): 
     normalizeValFunc(datum); 
} 

var input = userData; 
var min, max, floor, ceiling = /* Calculate min, max, floor, and ceiling */ 
var output = parsing(input, normalizeValFunc(min, max, floor, ceiling)); 

传递功能,如Java中的参数可能会非常棘手,因为功能不是Java中的头等对象。 (可能的Java 8 Lambda表达式改变呢?)其他问题解决传递功能在Java中参数的问题,如How to pass a function as a parameter in Java?What's the nearest substitute for a function pointer in Java?Function Pointers in Java

然而,这些问题涉及通过其行为被定义的函数参数不是函数的输入值。事先并不知道归一化函数的min,max,floor和ceiling参数是什么,但我只希望有效的归一化函数采用一个参数,将该值归一化。

+1

看看番石榴功能https://code.google.com/p/guava-libraries/wiki/FunctionalExplained – keuleJ

+0

很好的参考。如果我有足够的声望,会赞成你。 –

+1

你需要关闭。 Lambdas使它变得简单,但不幸的是,匿名类路由是Java 8之前的唯一途径。请参见[this](http://stackoverflow.com/questions/5443510/closure-in-java-7),[this]( http://stackoverflow.com/questions/233579/closures-in-java-7)等 – nawfal

回答

4

这样做的老式方法是使用一个接口:

public interface Normalizer { 
    int normalize(int value); 
} 

你会再创建一个Normalizer的实例,例如与匿名类:

public static Normalizer normalizeValFunc(final int min, final int max, final int floor, final int ceiling) { 
    return new Normalizer() { 
     @Override public int normalize(int value) { 
      /* Use min, max, floor, ceiling & value here to return something. */ 
     } 
    }; 
} 

然后,你可以写一个函数,它接受一个Normalizer

void parsing(int[] data, Normalizer normalizer) { 
    // Call normalizer.normalize(...) 
} 

,并调用它是这样的:

parsing(/* something here */, normalizeValFunc(min, max, floor, ceiling)) 

在Java 8,你能避免匿名类,只是使用lambda代替:

public static normalizeValFunc(final int min, final int max, final int floor, final int ceiling) { 
    return value -> /* Use min, max, floor, ceiling & value here to return something. */ 
} 

您不妨这样做在线:

parsing(/* something here */, value -> /* an expression using min, max, floor, ceiling, value */) 

而且,而非定义Normalizer,你可以使用标准的IntUnaryOperator功能接口(和呼叫applyAsInt,而不是normalize)。

+0

非常感谢。正是我在找什么。如果我有足够的声望,我现在可以立即支持你。 –