Как проверить, является ли Объект в Списке списка пустым или нулевым - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть что-то вроде List<List<UsersDetails>> userList, если я отлаживаю, чтобы увидеть его значение, оно дает [[]], т. Е. List<UsersDetails> пусто и List<List<UsersDetails>> также пусто, есть ли способ проверить, пусто ли List<UsersDetails>без итерации.

Я пробовал функции userList.sizeOf, userList.empty() и оператор userList==null, но все дают false.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Там нет.Существует:

if (userList.isEmpty() || userList.get(0).isEmpty()) { ... }

Но в основном, если понятие: «Это список списков, в котором список списков содержит 1 список, но этот список пуст», то, что вы должны считать «пустым», выИспользуете неправильную структуру данных.Вы не объяснили, что вы моделируете с этим List<List<UsersDetails>>, но, возможно, если вы уточните это, какой-то другой тип данных в java. * Или, возможно, guava будет гораздо более подходящим.Например, возможно, Map<Integer, UsersDetail> здесь лучше подходит (сопоставление идентификатора пользователя с его данными).

0 голосов
/ 28 сентября 2018

Вы можете создать свой собственный List, который просто делегирует, например, ArrayList, но предотвращает добавление null или пустых списков:

public class NonEmptyUserList implements List<List<UserDetails>>{

  private ArrayList<List<String>> mDelegate = new ArrayList<>();

  public void add(int index, List<UserDetails> element) {
    if (element == null || element.isEmpty()) {
      return;
    }

    mDelegate.add(index, element);
  }

  public boolean add(List<UserDetails> element) {
    if (element == null || element.isEmpty()) {
      return false;
    }

    return mDelegate.add(e);
  }

  public List<UserDetails> set(int index, List<UserDetails> element) {
    if (element == null || element.isEmpty()) {
      return null;
    }

    return mDelegate.set(index, element);
  }

  public boolean addAll(Collection<? extends List<UserDetails>> c) {
    boolean changed = false;
    for (final List<String> list : c) {
        changed = changed || add(list);
    }
    return changed;
  }

  public boolean addAll(int index, Collection<? extends List<UserDetails>> c) {
    boolean changed = false;
    int startIndex = index;
    for (final List<String> list : c) {
        add(startIndex, list);
        changed = changed || (list != null) && !list.isEmpty();
        startIndex++;
    }

    return changed;
  }

  // delegate all other methods required by `List` to mDelegate
}

Используя этот список, вы можете быть уверены, что нет null или будут присутствовать пустые значения, и, таким образом, вы можете использовать:

NonEmptyUserList userList = new NonEmptyUserList();
userList.add(null);
userList.add(Collections.emptyList());
userList.isEmpty(); // returns true

List<UserDetails> subList = new ArrayList<>();
subList.add(null);

userList.add(subList);
userList.isEmpty(); // returns false

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

Я лично считаю, что ответ @Mureinik, использующий потоки, является наиболее благоприятным.

0 голосов
/ 28 сентября 2018

Если вы хотите проверить каждый элемент во «внешнем» списке, вы должны перебрать его как-то .Тем не менее, потоки Java 8 скрыли бы это от вас и обеспечили бы немного более чистый синтаксис:

boolean allEmpty = userList.stream().allMatch(l -> l == null || l.empty());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...