Je ne veux pas itérer à la fois la liste tant de fois
Pourquoi? L'optimisation prématurée est une mauvaise chose. Testez-le d'abord, mesurez s'il est suffisamment efficace et résolvez le problème s'il existe.
Vous pouvez y arriver avec des flux en utilisant un filtre simple:
class Student
{
long id;
}
final List<Student> students = /*something*/;
final List<Long> rollNoList = /*something*/;
List<Student> newStudents = students.stream()
.filter(student -> rollNoList.contains(student.id))
.collect(Collectors.toList());
L'avantage de le faire avec des flux est que vous pourrez peut-être paralléliser plus tard.
Une optimisation supplémentaire consisterait à examiner votre utilisation des structures de données. Comme Seelenvirtuose rappelle, en utilisant quelque chose comme un HashSet
réduira la complexité de contains
de O (n) à O (1):
final Set<Long> rollNoList = new HashSet<>();
Si vous ne pouvez pas faire cela, vous pouvez voir le gain de performance, au coût de l'utilisation accrue de la mémoire, en copiant le List
dans un HashSet
avant de filtrer:
final Set<Long> rollNumbers = new HashSet<>(rollNoList);
mais si vous avez le contrôle sur la structure de données, il suffit d'utiliser HashSet
depuis le début.
Eh bien, vous feriez mieux de commencer à travailler dessus. Stack Overflow n'est pas un type de demande/de type de site ... c'est un site Q and A – CraigR8806
Hors sujet: Il y a rarement une telle chose comme "universel le plus efficace". Cela dépend de l'utilisation réelle – ControlAltDel
Veuillez au moins mentionner la version Java que vous utilisez – Alexandr