Вы можете использовать такой подход:
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();
}
});
}
}
Здесь вы определяете поведение скаляра извне и применяете поведение к каждому элементу массива.Но то, как элементы повторяются, не относится к вызывающей стороне.(Скажите не спрашивайте)
Таким образом, вы не дублируете код цикла, который перебирает элементы.И вы достаточно гибки, чтобы добавлять различные типы скалярных методов.
Редактировать: я добавил второй общий параметр для результата, как предложил Фабиан.Это делает метод более гибким.Я также удалил приведение массива (что было неправильно в первую очередь).