Преобразовать список <String>в список <MyObject>, где MyObject содержит int, представляющий порядок - PullRequest
6 голосов
/ 16 сентября 2011

Есть ли шаблон, или встроенная функция, которую я пропускаю, или я должен просто пройтись по кругу вот так

public List<MyObject> convert(List<String> myStrings){

    List<MyObject> myObjects = new ArrayList<MyObject>(myStrings.size());

    Integer i = 0;
    for(String string : myStrings){
        MyObject myObject = new myObject(i, string);
        myObjects.add(object);
        i++;
    }
    return myObjects;
}

Это потому, что мне нужно сохранить список в базе данных и сохранить порядок.

Ответы [ 4 ]

8 голосов
/ 16 сентября 2011

Вы можете использовать Гуава :

List<MyObject> myObjects = Lists.transform(myStrings,
   new Function<String, MyObject>() {
       private int i = 0;
       public MyObject apply(String stringValue) {
           return new MyObject(i++, stringValue);
       }
   });

На самом деле это просто приносит итерацию в библиотеку. С точки зрения написанного кода, оно будет примерно таким же, пока не будут введены замыкания в Java 8.

Однако вы должны знать, что создание функции с таким состоянием (с i) является плохой формой, поскольку теперь важен порядок, в котором она применяется к списку.

1 голос
/ 16 сентября 2011

Закрытия и лямбды, которые идут в Java 8, должны позволять Java иметь такие вещи, как функции Mapper и Reducer (как в MapReduce).На самом деле, если вы следите за последними разработками из Project Lambda, вы увидите много примеров лямбда-кода, работающего с коллекциями.

например,

Collections.sort(people, 
                 #{ Person x, Person y -> x.getLastName().compareTo(y.getLastName()) });

Но до тех пор код, который вы разместили в своемвопрос должен хватить.

0 голосов
/ 16 сентября 2011

Я повторю приведенный выше комментарий световой кодировщика и удивлюсь, почему вам нужно преобразовать Список - который по определению имеет информацию о порядке упорядочения - вместо простого сохранения данных в базе данных напрямую.

При этом яЯ все еще предложу краткий фрагмент кода:

for (final String string : myStrings) {
    myObjects.add(new MyObject(myObjects.size(), string));
}
0 голосов
/ 16 сентября 2011

Ваш код будет работать нормально.Это немного чище, если вы используете groovy, потому что вы можете просто сделать что-то вроде:

def i = 0;
def myObjects = myStrings.collect {str -> new MyObject(i++, str);}

или Guava, как код Марка ПитераНо если вы не хотите переключать языки или импортировать новую библиотеку, ваш код в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...