从单一返回功能自动生成数组(列表)

时间:2013-11-04 14:39:59

标签: java arrays function

对于稍微更易读的代码,这更像是一个假设性问题。除了有另一个函数返回数组之外,还有更优雅的方式做这样的事吗?在编写JUnit Tests时,我已经多次遇到过这段代码,这只是一个眼睛疼痛。我有10个函数来生成特定类型的随机数组,它非常混乱。

public ObjectA getA()
{
    return new ObjectA("random", "stuff", "constructor");
}

public void doStuffWithA(ObjectA objs[])
{
    // do stuff with loop / array
}

public void main()
{
    ObjectA objs[] = new ObjectA[10];

    for (int x = 0; x < objs.length; x ++)
        objs[x] = getA();

    doStuffWithA(objs);
}

也许更清洁的东西:

doStuffWithA(toArray(getA(), 10));

但是传递实际的函数调用似乎不可能。 即使这样也是可以接受的:

ObjectA objs[] = new ObjectA[10]{getA(), 10};

4 个答案:

答案 0 :(得分:1)

这在函数式编程中是众所周知的;使用基本Java(这是一种命令式语言)直到版本7,它是不可能的。然而,有很多方法可以做到这一点。

最简单的方法可能是学习如何使用lambdaj。这将有点复杂,但使用它你将能够构建一个可以传递给你的函数的生成器,并将根据你的需要创建对象。

另一种可能的方法是手动编写一个生成给定函数的生成器类;界面看起来像这样:

public interface Generator<T> {
    T generate();
    T[] generateSeveral(int);
}

然后你可以有一个这样的实现:

class ObjectAGenerator implements Generator<ObjectA> {
    public ObjectA generate() {
       return new ObjectA("random", "stuff", "constructor");
    }

    public ObjectA[] generateSeveral(int amount) {
        ObjectA[] result = new ObjectA[amount];
        for(int i=0; i<amount; i++) {
            result[i] = generate();
        }
    }
}

你可以像这样使用它:

doStuffWithA(new ObjectAGenerator().generateSeveral(10));

答案 1 :(得分:-1)

尝试Arrays.fill(Object [] a,Object val):http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html

答案 2 :(得分:-1)

Arrays.fill会帮助你。

你可以这样做

ObjectA objs[] = new ObjectA[10];       
Arrays.fill(objs, getA());

//just printing objects     
for (int x = 0; x < objs.length; x ++)
      System.out.println(objs[x]);

答案 3 :(得分:-1)

Arrays.fill(ArrayOfObjects,ObjectA);