Поток Java удаляет первые три элемента - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть список объектов, отсортированных по ученикам id:

List<Student> arraylist = new ArrayList<>();
arraylist.add(new Student(1, "Chaitanya", 26));
arraylist.add(new Student(2, "Chaitanya", 26));
arraylist.add(new Student(3, "Rahul", 24));
arraylist.add(new Student(4, "Ajeet", 32));
arraylist.add(new Student(5, "Chaitanya", 26));
arraylist.add(new Student(6, "Chaitanya", 26));

Я хотел бы использовать stream и удалить только первые три элемента, где ученик age равен 26.Не могли бы вы помочь мне с этим.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

сначала найдите элементы, которые вы хотите удалить через потоковый API:

List<Student> toRemove = arraylist.stream()
                                  .filter(x -> x.getAge() == 26)
                                  .limit(3)
                                  .collect(toList());

, затем удалите из списка источников:

toRemove.forEach(arraylist::remove);

, если вы не хотите изменятьзатем источник сначала клонирует его:

List<Student> resultSet = new ArrayList<>(arraylist);
List<Student> toRemove = arraylist.stream().filter(x -> x.getAge() == 26).limit(3)
                                  .collect(toList());
toRemove.forEach(resultSet::remove);

В конце концов, это может быть лучше реализовано с помощью итератора:

int counter = 0;
for (Iterator<Student> it = arraylist.iterator(); it.hasNext();){        
      if(counter == 3) break;
      Student student = it.next();
      if (student.getAge() == 26){
          it.remove();
          counter++;
      }
}
0 голосов
/ 18 декабря 2018

Вы можете использовать filter и skip как:

List<Student> finalList = arraylist.stream()
        .filter(a -> a.getAge() == 26) // filters the students with age 26
        .skip(3) // skips the first 3 
        .collect(Collectors.toList());

Это приведет к перечислению Student с возрастом, равным 26, в то же время пропуская первые три вхождения таких студентов.


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

List<Student> allStudentsExcludingFirstThreeOfAge26 = Stream.concat(
            arraylist.stream().filter(a -> a.getAge() != 26),
            arraylist.stream().filter(a -> a.getAge() == 26).skip(3))
        .collect(Collectors.toList());

Обратите внимание, что этоможет привести к изменению первоначального порядка списка.

...