创建一个方法,生成另一个给定函数的x和y值



我刚刚开始学习Java Runnable s,我听说过Callable s。然而,我非常挣扎于这个问题。我想做一个以函数为参数的方法(无论是作为Callable, Runnable还是其他东西,只要我可以简单地将函数调用为coolNewFunction(() -> otherFunction(), 100)或类似的简单方式),该方法将返回otherFunction返回值的数组。例如,假设我定义了函数

public static int square(int x){
    return x * x;
} 

我可以这样做:

coolNewFunction(() -> square(), 100)

这将返回前100个数字及其平方的数组(即{{1, 1}, {2, 4}, {3, 9}...})。现在我马上知道lambda () -> square()不能工作,因为square必须传递一个值。我想创建一个100个Runnable的数组,每个都有square的下一个参数,但run()方法仍然不返回任何东西。所以,长话短说,一个方法是什么样子的,它计算另一个函数,这个函数作为一个参数,如square,在不同的x值,并返回一个数组的评估?另外,最好我不想开始任何新的线程,虽然如果这是唯一的方法,这可以实现比那是好的。最后,我不想以特殊的方式(最好)实现square(或其他)函数。

如果我不使用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的返回类型——以防您厌倦了平方。

希望对您有所帮助:

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;
}

相关内容

  • 没有找到相关文章

最新更新