Получить объекты из списка объектов на основе переменной в объекте - PullRequest
8 голосов
/ 05 июня 2011

У меня есть список объектов User, я просто хочу получить объекты User из списка на основе переменных в объекте User.

public class User {

    private int id;

    private String sex;

    private int age;

    private String country;

    /**
     * Getter and setter for all variables
     */
}

У меня есть такой класс моделей. Теперь у меня есть список объектов пользователя.

List<User> users = new ArrayList<User>();

Я хочу получить объекты из списка пользователей, если пользователь - мужчина.

List<User> ageList = new ArrayList<User>();
for(User object : users) {
    if(object.getSex().equals("Male")){
        ageList.add(object);
    }
}

Мне не нравится вышеуказанный подход. Есть ли лучший способ получить объекты из списка объектов на основе переменной в объекте ..?

Есть ли функции Java Collections ..? мы можем решить это с помощью Java Comparator ..?

Ответы [ 5 ]

8 голосов
/ 05 июня 2011

Если вы используете Гуава , вы можете использовать Collections2.filter:

Collection<User> males = Collections2.filter(users, new Predicate<User>() {
    @Override
    public boolean apply(User user) {
        return user.getSex().equals("Male");
    }
});

А с Java 8 вы можете сделать еще лучше:

Collection<User> males = Collections2.filter(users, user -> user.getSex().equals("Male"));
3 голосов
/ 05 июня 2011

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

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

Кстати: я бы использовал Enum для пола человека.Вы должны быть в состоянии ограничить себя несколькими возможностями;) Вы можете сделать то же самое со страной.

2 голосов
/ 18 февраля 2017

Я нашел способ в java8 с фильтром потоков

List<User> males = users.stream().filter(u -> u.getSex().equals("Male")).collect(Collectors.toList());
1 голос
/ 05 июня 2011

Для простых фильтров мне нравится синтаксис lambdaj onliners: http://code.google.com/p/lambdaj/wiki/LambdajFeatures

List<User> ageList = filter(having(on(User.class).getSex(), equalTo("Male")), users);

Для сложных условий лучше создать отдельную фильтрацию.

0 голосов
/ 05 июня 2011

Используйте MultiValueMap из Общая коллекция Apache или просто Map<String List<User>> для разделения пользователей в начале, если все, что вам нужно, это получить пользователей по полу.

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

Общие коллекции Apache (и Guava, как упоминал Крис Джестер-Янг) предоставляют CollectionUtils.select(), все, что вам нужно сделать, это реализовать Predicate. (см. ответ Криса Джестера-Янга для лучшего объяснения)

Или вместо использования коллекции для передачи пользователей превратите ее в объект, подобный Users или UserPack. Затем вы можете реализовать вызов метода getMaleUsers(), чтобы вернуть всех пользователей-мужчин внутри объекта для вас. Этот прием очень полезен, если вам нужно много манипулировать конкретными объектами.

...