Нужно перебрать массив / список / что угодно и * вернуть вызывающему элементу * каждый элемент - но цикл запускается только один раз, конечно - PullRequest
0 голосов
/ 19 сентября 2010

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

Но, если я зацикливаю коллекцию, очевидно, что цикл запускается только один раз и возвращает только 1-й объект.

Редактировать: возврат всей коллекции или новой коллекции не будет работать, потому что:

Метод вызывающей стороны [не мой, чтобы изменить] запускается внутри метода start () объекта Runnable ThingProvider, который возвращает одну вещь при каждой отправке запроса. Таким образом, возврат списка невозможен.

Спасибо:)

Ответы [ 8 ]

4 голосов
/ 19 сентября 2010
public List<T> loop(Collection<? extends U> coll) {
    List<T> a = new ArrayList<T>();
    for (U u : coll){
         a.add(new T(u));
    }
    return a;
}
3 голосов
/ 19 сентября 2010

Возвращает пользовательский Итератор .Предполагая, что ваши новые объекты имеют класс MyObject, и конструктор принимает Object:

public Iterator<MyObject> myObjectsIterator(final Iterator<? extends Object> it) {
    return new Iterator<MyObject>() {
        public boolean hasNext() {
            return it.hasNext();
        }

        public MyObject next() {
            return new MyObject(it.next());
        }

        public void remove() {
            it.remove();
        }
    };
}

И вы бы назвали его так:

...
Iterator<MyObject> myIt = myObjectsIterator(myListOfObjects.iterator());
// Now you can pass myIt around as a normal object. It will remember
// which one is the next Object with which to construct a MyObject
// and will generate it on the fly
...
while (myIt.hasNext()) { // is there any MyObject remaining?
    MyObject myObj = myIt.next(); // gets the next MyObject
    // do something with myObj
}
...
2 голосов
/ 19 сентября 2010

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

public interface Command {
    void execute(NewType object);
}

Теперь в вашем методе вызова вы можете сделать следующее:

public void doSomething() {
    processList(myList, new Command() {
        void execute(NewType object) {
            // Do whatever you want with this object
        }
    });
}

И, в методе, который фактически будет проходить через список:

public void processList(Iterable<OldType> values, Command command) {
    for(OldType v : values) {
        NewType newType = new NewType(v);
        command.execute(newType);
    }
}
1 голос
/ 19 сентября 2010

В Java вы можете вернуться только один раз.Поэтому, если вы хотите получить некоторую информацию от ваших методов, вы либо заключаете их в «Большой» объект (здесь список), либо вы предоставляете методу средства для помещения информации в ваши параметры.

Вы можете иметькак-то так:

public static void main(String... args){
    List<Parameter> parameters = methodToGetParameters();
    List<Result> results = generateObjectsFromList(parameters);
    for(Result result : results){
        handleAResult(result);
    }
}

public List<Result> generateObjectsFromList(List<Parameter> parameters){
    List<Result> results = new ArrayList<Result>();

    for(Parameter parameter : parameters){
        results.add(new Result(parameter));
    }

    return results;
}

Или вот так:

public static void main(String... args){
    List<Parameter> parameters = methodToGetParameters();
    List<Result> results = new ArrayList<Result>();
    generateObjectsFromList(parameters, results);
    for(Result result : results){
        handleAResult(result);
    }
}

public void generateObjectsFromList(List<Parameter> parameters, List<Result> results){        
    for(Parameter parameter : parameters){
        results.add(new Result(parameter));
    }        
}

Третий способ сделать это - использовать поля, но это не очень хорошоиметь много полей, если они не используются (или только одним методом).


По той же теме:

0 голосов
/ 24 сентября 2010

Возможно.

Проверьте эти проекты на Java-yield , yield4Java , infomancers

Если выЕсли вы используете это просто один раз во всем коде, вам лучше выбрать метод из других ответов.

0 голосов
/ 19 сентября 2010

Возвращает коллекцию из метода и в коллекции реализует пользовательский итератор для преобразования входной коллекции в новую коллекцию. Следующий код показывает, как это сделать с помощью библиотеки Google Guava :

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import com.google.common.base.Function;
import com.google.common.collect.Collections2;

public class Test {

    static class Person {
        public final String name;
        public Person(String name) {
            this.name = name;
        }
    }

    public static Collection<Person> peopleFromNames(Collection<String> names) {
        return Collections2.transform(names, new Function<String, Person>() {
            public Person apply(String name) {
                return new Person(name);
            }});
    }

    public static void main(String[] args) {
        List<String> names = Arrays.asList("Brian", "Albert", "Roger");
        for (Person person : peopleFromNames(names)) {
            System.out.println(person.name);
        }
    }

}
0 голосов
/ 19 сентября 2010

Вы имеете в виду использование делегатов, как показано ниже

public class Test {

    private static class Person{
        private final String name;

        Person(String name){
            this.name = name;
        }

        @Override
        public String toString() {
            return return name;
        }
    }

    private interface Printer {
        void print(Object object);
    }

    public static void main(String[] args) {
        final String[] names = {"one", "two", "three"};
        final ArrayList<Person> people = construct(names, new Printer() {

            @Override
            public void print(Object object) {
                System.out.println(object.toString());
            }
        });
    }

    private static ArrayList<Person> construct(String[] names, Printer printer) {
        ArrayList<Person> people = new ArrayList<Person>();
        for (String name : names) {
            printer.print(new Person(name));
        }
        return people;
    }

}
0 голосов
/ 19 сентября 2010

Возвращает список новых объектов.

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