Проверьте, удовлетворяет ли некоторый объект в ArrayList некоторому условию - PullRequest
4 голосов
/ 17 июля 2011

У меня есть ArrayList<Person> persons. Я хочу проверить, выполняет ли какое-то лицо лично условие. Нравится: person.isFemale()

Вместо зацикливания списка, есть ли лучший способ сделать это? Может быть, какое-то отображение или лямбда?

Edit:

Привет и спасибо за ответы!

Я думаю, что задал неправильный вопрос .. Я хочу проверить, отличается ли какой-либо объект в списке от любого другого: логическое другое = (если isMale () && isFemale ()) где-то в списке.

Ответы [ 4 ]

4 голосов
/ 17 июля 2011

Я бы порекомендовал Guava (формально Google Collections), в частности Iterables.any , чтобы проверить, соответствует ли один экземпляр условию, или Iterables.all , чтобы проверить, соответствует ли все экземпляры условию.,Вы можете установить свой предикат либо для совпадения с некоторым логическим выражением, либо для проверки того, что все элементы равны заголовку списка.

Это не делает ничего сложного изнутри, но оно, по крайней мере, поможет вампривычка писать код в функциональном стиле.

3 голосов
/ 17 июля 2011

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

List<Person> persons = ...;     

List<Person> matchingUsers = Collections2.filter(persons, new Predicate<Person>() {

    @Override
    public boolean apply(Person person) {
        return person.isFemale();
    }
});

if (!matchingUsers.isEmpty()) {
    ...
}
1 голос
/ 17 июля 2011

Я не знаком с Гуавой, но вы все равно "зациклили бы список" с Iterables.any.Если ваше состояние вашего Person никогда не меняется, находясь в списке, используйте пользовательский подкласс ArrayList (или другого списка) и проверьте условие в методах вставки.

1 голос
/ 17 июля 2011

Зачем вам "зацикливать список", чтобы узнать что-то об экземпляре Person - если у вас есть ссылка на Person, просто используйте это. Я могу только предположить, что вы имели в виду вопрос:

Как найти экземпляры Person, соответствующие определенному условию?

Если это так, вы можете отсортировать список с помощью Comparator, который сортирует людей с низким значением isFemale (), чтобы они попадали в начало списка, тогда вы можете выполнять цикл, пока person.isFemale () не станет ложным, например:

List<Person> persons = ...; 
Collections.sort(list, new Comparator<Person>() {
    public int compare(Person o1, Person o2) {
        return o1.isFemale().compareTo(o2.isFemale()); // Note: Assumes isFemale returns Boolean, not boolean. Otherwise, wrap before comparing.
    }
});

for (Person person : persons) {
    if (!person.isFemale()) {
        break;
    }
    // Do something with females
}

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

...