制作一个生成另一个给定函数的x和y值的方法

时间:2016-08-09 19:23:41

标签: java lambda java-8 runnable callable

我刚开始学习Java Runnable,我听说过Callable。但是,我非常努力解决这个问题。我想创建一个方法,它将函数作为参数(无论是CallableRunnable还是其他东西,只要我可以简单地将函数称为{{1或者一些类似的简单方法)并且该方法将返回coolNewFunction(() -> otherFunction(), 100)的返回值的数组。例如,假设我定义了函数

otherFunction
然后我可以按照以下方式做点什么:

public static int square(int x){

    return x * x;

} 

这将返回前100个数字及其正方形的数组(即coolNewFunction(() -> square(), 100) )。现在,我知道{{1, 1}, {2, 4}, {3, 9}...}无效,因为lambda () -> square()必须传递一个值。我创建了一个包含100 square个数组的数组,每个数组都有Runnable的下一个参数,但方法square仍然没有返回任何内容。 所以,长话短说,一个方法看起来会是什么样的,它会评估另一个函数,它在不同的x值下作为run()这样的参数给出并返回该评估的数组?另外,最好我不想开始任何新的线程,虽然这是唯一可以实现这一点的方法。最后,我不想以特殊方式(最好)实现square(或其他)功能。

2 个答案:

答案 0 :(得分:2)

我希望你不介意我不使用Array,但我会使用你的square方法

public Map<Integer, Integer> lotsOfSquares(int limit) {

    return IntStream.rangeClosed(1,limit)                         // Creates a stream of 1, 2, 3, ... limit
                    .boxed()                                      //  Boxes int to Integer. 
                    .collect(Collectors.toMap(i -> i,             // Collects the numbers, i->i generates the map key
                                              i -> square(i));    // Generates the map value
}

这会为您提供包含{1=1, 2=4, 3=9, ... , 99=9801, 100=10000}

的地图

您应该在limit上添加一些验证。

更新:

public <T> Map<Integer, T> lotsOfResults(int limit, Function<Integer, T> f) {

    return IntStream.rangeClosed(1,limit)                        
                    .boxed()                                      
                    .collect(Collectors.toMap(i -> i,             
                                              i -> f.apply(i));    
}

现在,您可以致电lotsOfResults(100, i -> square(i))

请注意,Tf的返回类型 - 如果您厌倦了平方。

答案 1 :(得分:1)

希望这会有所帮助:

public int[][] fn2Array(Function<Integer, Integer> fn, int x) {
    int[][] result = new int[x][2];
    for (int i; i < x; i++) {
        result[i][0]=i+1;
        result[i][1]=fn.apply(i+1);
    }
    return result;
}