Самый простой способ вернуть несколько объектов из метода - PullRequest
0 голосов
/ 10 ноября 2019

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

Я хочускажи, что я попробовал все, что "я" могу придумать, я даже не могу вспомнить, что я пытался. Недавно я попытался вернуть ArrayList объектов, которые соответствуют имени, но, кажется, добавляют только один объект в список. Я просто запутался в этом вопросе.

Начальная попытка (возвращает один объект):

public Contact getContactByName(String x) {
    for (Contact c : contacts) {
        if (c.getName().equalsIgnoreCase(x)) {
            return (c);
        }
    }
    return null;
}

Другая попытка (возвращает только один объект в списке):

public ArrayList<Contact> getContactByName(String x) {
    ArrayList<Contact> temp = new ArrayList<>();
    for (Contact c:contacts) {
        if (c.getName().equalsIgnoreCase(x)) {
           temp.add(c);
        }
    }
    return temp;
}

Я предполагаю, что return (c) вернет контакт за итерацию цикла, если он соответствует условиям if. Я предполагаю, что упустил что-то очень фундаментальное. То, что я хотел бы видеть возвращенным в GUI, это:

Джо Смит 555-555-5555 321 Уотер-стрит

Джо Смит 123-123-1234 456 E Street

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Существует очень чистый способ сделать это, и это легко, и это при использовании Stream, если вы используете Java 8 и выше.

List<Contact> filteredContactList = contacts.stream().filter(contact -> contact.getName().equalsIgnoreCase(x)).collect(Collectors.toList());  

Что здесь происходит? Итак, давайте разберем его:
Метод stream вызывается на List, и вот что такое потоки - последовательность объектов, которыеподдерживает различные методы, которые можно конвейеризовать для получения желаемого результата .
Думайте об этом как о супер-умном for-loop (только в вашем случае, а не в целом), который позволяет не только выполнять итерациичерез ваши коллекции, но также позволяет применять функции во время итерации.

Метод filter очень похож на условие if. Разница в том, что это больше похоже на барьер, который говорит:

"Только объекты в коллекции, которые удовлетворяют данному условию, должны иметь возможность двигаться вперед"

,

Теперь появилась функция collect. Это в основном берет все элементы, которые проходят из предыдущих функций, и формирует их в структуру данных, для которой мы ее указываем, и в вашем случае List.

Исходная коллекция, для которой вы вызываете метод stream, вообще не затрагивается, вместо этого новая коллекция создается каждый раз, когда должна произойти операция. Вместо этого возвращается совершенно новый объект коллекции.

0 голосов
/ 10 ноября 2019

Вместо возврата элемента добавьте его в список результатов и верните его после завершения цикла. Оператор возврата завершает текущий метод.

Редактировать перед тем, как возвращать список, проверьте, нет ли в вашем втором подходе фигурных скобок вокруг цикла for.

Кроме того, это может быть оптимальной ситуацией дляфункция потока с фильтром. Смотрите здесь

https://www.google.com/amp/s/www.geeksforgeeks.org/stream-filter-java-examples/amp/

Привет

Матиас

...