Java - 在相同对象的数组上重用标量方法

时间:2012-03-26 08:38:01

标签: java vectorization

假设有方法Operation

public ObjectOut Operation(ObjectIn input)

将操作方法​​应用于ObjectIn []对象的最佳方法是什么? 你需要明确地重载Operation

public ObjectOut[] Operation(ObjectIn[] input) {
    ObjectOut[] output = new ObjectOut[input.length];

    for (int i=0; i<input.length; i++)
        output[i] = Operation(input[i]);
}

对于所有这样的“标量”方法,是否有更通用的方法一次

3 个答案:

答案 0 :(得分:2)

您可以将GuavaLists.transform()用于此目的。

List<ObjectOut> output = Lists.transform(
      new ArrayList<ObjectIn>() // your input list
  ,   new Function<ObjectIn, ObjectOut>() {
            @Override
            public ObjectOut apply(ObjectIn input) {
                // process your input
                return null;
            }
      } 
);

集合中也存在Collections2.transform(),Iterables存在Iterables.transform()。您应该知道返回的列表是一个视图。在继续使用它之前,您可能想要创建它的副本。请务必查看文档。

但在使用之前你应该知道downsides正如@LouisWasserman指出的那样。

答案 1 :(得分:1)

你可以使用这样的方法:

public class Scalar {

    interface ScalarMethod<T, O> { O apply(T input); }

    public static<T, O> O[] scalar(T[] array, O[] result, ScalarMethod<T, O> method) {

        for ( int i=0; i < array.length; i++ ) {
            result[i] = method.apply(array[i]);
        }
        return result;
    }

    public static void main(String[] args) {
        String[] input = new String[] { "Hello", ", world!" };

        Integer[] result = Scalar.scalar(input, 
                                         new Integer[input.length],
                                         new ScalarMethod<String, Integer>() {
            @Override
            public Integer apply(String input) {
                System.out.println(input);
                return input.length();
            }
        });
    }

}

在这里,您可以从外部定义标量的行为,并将行为应用于每个数组项。但是如何迭代项目与调用者无关。 (告诉不要问)

这样你就不会复制遍历项目的循环代码。而且你足够灵活,可以添加各种类型的标量方法。

编辑:我为Fabian建议的结果添加了第二个通用参数。这使得该方法更加灵活。我还删除了数组的转换(首先是错误的)。

答案 2 :(得分:0)

简短的回答是否定的,没有通用的方法来实现这一点。

但是有很简洁的方法。

您可以创建一个包含ObjectIn对象数组的包装类,并提供您需要的任何方法,例如;

public class ObjectInArray {
    ObjectIn[] objects;
    public ObjectOut[] OperationAll() {
        ObjectOut[] output = new ObjectOut[objects.length];
        for(int i=0; i<objects.length; i++) output[i] = ObjectIn.operation();
        return output;
    }
}