Скажем, у меня есть List<Car>
, и я хочу выполнить поиск по этому списку, чтобы убедиться, что у меня есть Civic AND a Focus. Если это очень просто, я могу просто применить OR на .filter()
. Имейте в виду, что я не могу сделать filter().filter()
для этого типа И.
Рабочее решение:
boolean hasCivic = reportElements.stream()
.filter(car -> "Civic".equals(car.getModel()))
.findFirst()
.isPresent();
boolean hasFocus = reportElements.stream()
.filter(car -> "Focus".equals(car.getModel()))
.findFirst()
.isPresent();
return hasCivic && hasFocus;
Но тогда я в основном обрабатываю список дважды. Я не могу применить &&
в фильтре, и я не могу сделать filter().filter()
.
Есть ли способ обработать поток один раз, чтобы найти, содержит ли список как автомобиль Civic, так и Focus?
ВАЖНОЕ ОБНОВЛЕНИЕ: Основная проблема с предоставленными решениями заключается в том, что все они гарантируют O (n), тогда как мое решение может быть выполнено после двух сравнений. Если в моем списке автомобилей говорят 10 миллионов автомобилей, тогда будет очень значительная стоимость исполнения. Мое решение, однако, не очень хорошо, но, возможно, это лучшее решение, разумное...