Это зависит от того, как часто вам нужно выполнять эту логику для ваших входных данных.
Если это происходит несколько раз, рассмотрите возможность использования Map
, как предложено Raz .
Вы также можете преобразовать List
в Map
, используя Stream
:
Map<Integer, MyObject> map = list.stream()
.collect(Collectors.toMap(
MyObject::getId
Function.identity()
));
Первый аргумент toMap
сопоставляет элемент потока с соответствующим ключом на карте (здесь идентификатор MyObject
), а второй аргумент сопоставляет элемент со значением карты (здесь сам элемент MyObject
) ).
Построение карты будет стоить вам времени и памяти, но как только вы ее получите, поиск элемента по идентификатору будет чрезвычайно быстрым.
Чем чаще вы будете искать предмет, тем больше будет выгоднее строить карту.
Однако, если вам когда-либо понадобится обновить только один элемент, а затем забыть обо всем списке, просто найдите нужный элемент, обновите его, и все готово.
Если ваши данные уже отсортированы по идентификатору, вы можете использовать бинарный поиск, чтобы быстрее найти ваш элемент.
В противном случае вам нужно перебирать свой список, пока вы не найдете свой предмет. С точки зрения производительности, ничто не будет бить простой цикл здесь. Но использование Stream
и Optional
, как показано в ответе Deadpool , также подойдет и может привести к более четкому коду, что более важно в большинстве случаев.