Java - Повторное использование скалярных методов на массивах одинаковых объектов - PullRequest
1 голос
/ 26 марта 2012

Скажите, что есть метод 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 ]

2 голосов
/ 26 марта 2012

Для этой цели вы можете использовать Гуава 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.transform() для итераций.Вы должны знать, что возвращаемый список является представлением.Возможно, вы захотите создать его копию, прежде чем продолжать работать с ней.Обязательно ознакомьтесь с документацией.

Но перед использованием этого вы должны знать о недостатках , как указал @LouisWasserman.

1 голос
/ 26 марта 2012

Вы можете использовать такой подход:

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

}

Здесь вы определяете поведение скаляра извне и применяете поведение к каждому элементу массива.Но то, как элементы повторяются, не относится к вызывающей стороне.(Скажите не спрашивайте)

Таким образом, вы не дублируете код цикла, который перебирает элементы.И вы достаточно гибки, чтобы добавлять различные типы скалярных методов.

Редактировать: я добавил второй общий параметр для результата, как предложил Фабиан.Это делает метод более гибким.Я также удалил приведение массива (что было неправильно в первую очередь).

0 голосов
/ 26 марта 2012

Короткий ответ - нет, универсального способа сделать это не существует.

Однако существуют очень чистые способы.

Вы можете создать класс-обертку, содержащий ваш массив объектов 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...