假设有方法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]);
}
对于所有这样的“标量”方法,是否有更通用的方法一次?
答案 0 :(得分:2)
您可以将Guava的Lists.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;
}
}