Как удалить несколько объектов из списка объектов - PullRequest
0 голосов
/ 13 апреля 2019

Предположим, у меня есть список объектов Employee, и у каждого класса Employee есть такие свойства, как employeeName, employeeAddress, salary и т. Д. Теперь мне нужно удалить объекты Employee с именем "John" и Salary> 40000.

List empList = new ArrayList <> (); // Добавляем миллионы сотрудников в empList.

Согласно моему пониманию, чтобы удалить сотрудника с вышеуказанным условием, я должен использовать следующий код:

Iterator<Employee> iterator = list.iterator();
while (iterator.hasNext()) {
      Employee employee = iterator.next();
      if ("John".equals(employee.getName) && employee.getSalary>40000) { 
      iterator .remove(); 
    }
 }

Таким образом, приведенный выше код удалит требуемый объект Employee из списка. Пожалуйста, дайте мне знать, если мое понимание верно.

Кроме этого, пожалуйста, уточните следующее: 1. Когда у нас будут миллионы записей, как мы будем решать эту проблему. 2. Разница между iterator.remove () и list.remove ()

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

1) если вы хотите сохранить объекты живыми, вы можете фильтровать только нужные объекты

list.stream()
.filter(emp->"John".equals(emp.getName()) && emp.getSlaray() >40000)
.collect(Collectors.toList());

2) если вы перебираете коллекцию и используете:

Collection.remove()

специально вызывает ConcurrentModifcationException причину изменения состояния объекта, использованного ранее для создания явной серии вызовов, необходимых для завершения цикла, но при использовании

Iterator.remove()

вы изменяете базовую коллекцию И переоцениваете явные серии вызовов, необходимые для завершения цикла.

0 голосов
/ 14 апреля 2019

Нехорошо загружать миллионы объектов одновременно. Как вы получаете все эти записи? Если вы читаете их из базы данных, лучше выполнить там фильтрацию с помощью SQL.

where e.name = "John" and e.salary > 40000

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

Если вы реализуете это, как описано выше, вы также можете использовать потоки:

List<Employee> filteredList = list.stream()
    .filter(employee -> employee.getName().equals("John"))
    .filter(employee.getSlaray() > 40000)
    .collect(Collectors.toList());

и тогда вы можете иметь отфильтрованные списки из 1000 строк и обрабатывать их как отдельные.

...