Преобразование ArrayList объектов в ArrayList этих объектов Строковые имена в Java - PullRequest
4 голосов
/ 14 августа 2010

У меня есть ArrayList объектов пользователя.Теперь мне нужен ArrayList только для имен этих пользователей.Есть ли способ использовать toString() для всего ArrayList и преобразовать его в ArrayList из имен String вместо того, чтобы делать это в цикле for?Я также переопределил toString в классе User, поэтому он возвращает имя пользователя, и я попытался ArrayList <String> names = usersList.toString(), но это не сработало.

Ответы [ 4 ]

7 голосов
/ 14 августа 2010

Это можно сделать с помощью API Google Collections :

List<User> userList = ...;
List<String> nameList = Lists.transform(userList, new Function<User, String>() {
   public String apply(User from) {
      return from.toString(); // or even from.getName();
   }
});

Библиотека была переименована в Guava.


В Java 8, используяпотоки и ссылки на методы теперь позволяют достичь того же самого, даже не используя Guava:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class User {

    private String name;

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class App {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>(Arrays.asList(
                new User("Alan Turing"),
                new User("John von Neumann"),
                new User("Edsger W Dijkstra")
        ));

        List<String> names = users
                .stream()
                .map(User::getName)
                .collect(Collectors.toList());

        System.out.println(names);
    }
}
5 голосов
/ 14 августа 2010

Object#toString() возвращает String, а не ArrayList.Это твоя проблема.Вы действительно должны зацикливаться на этом.Нет абсолютно никаких причин для отвращения к зацикливанию.Просто скройте его в каком-нибудь служебном методе, если код вас как-то беспокоит;)


В Java 8 вы можете использовать лямбда-выражения, потоки и ссылки на методы для упрощения вашего кода.1010 * Следующая

List<User> users = getItSomehow();
List<String> names = new ArrayList<String>();
for (User user : users) {
    names.add(user.getName());
}

может быть затем сокращена до

List<User> users = getItSomehow();
List<String> names = users.stream().map(User::getName).collect(Collectors.toList());

Кстати, вы также можете поместить for в одну строку:

for (User user : users) names.add(user.getName());

Однако для начинающих это может быть непонятно.

1 голос
/ 14 августа 2010

Одним словом: Нет. Вам нужна функция map , которой у вас нет в Java (пока, как указывает BalusC). Вы можете написать что-то подобное самостоятельно, но в конечном итоге вы будете выполнять итерации по каждому элементу в своем Списке.

0 голосов
/ 14 августа 2010
public ArrayList< String > toStringList( Collection< MyObject > objectList )
{
    ArrayList< String > stringList = new ArrayList< String >();

    for( MyObject myobj : objectList ) {
        stringList.add( myobj.toString() );
    }

    return stringList;
}

...

ArrayList< String > myStringList = toStringList( objectList );

Там. Одна строка, и вы можете повторно использовать ее с любым набором объектов, которые у вас будут в будущем.

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