Я вижу несколько проблем с кодом, который вы разместили.Это код, который должен делать то, что вы ищете
if(jobs != null) {
for (Job job : jobs) {
if (shoppingJob == null && job.isShopping()) {
shoppingJob = job;
}
else if (deliveryJob == null && (job.isDelivery() || job.isRanger())) {
deliveryJob = job;
}
}
}
Итак, что нужно изменить:
1).Вторая часть вашего самого первого условия if выдаст NullPointerException
, если список заданий будет null
.У вас было
if(jobs != null || jobs.isEmpty()) {
, что означает: если задания не null
входят в блок, или если задания null
, вызов isEmpty()
на jobs
(и вызов isEmpty()
наnull
бросит NullPointerException
).isEmpty()
также является избыточным, как вы указали в комментариях.
Вместо этого я думаю, что это все, что вам нужно
if(jobs != null) {
2).Вы должны убедиться, что переменные shoppingJob
и deliveryJob
не будут перезаписаны после однократного присвоения значения, если вы хотите получить что-то эквивалентное findFirst()
из кода Stream.
В противном случае, если в списке более одного задания на покупку или более одного задания на поставку, эти переменные в итоге будут назначены последнему подходящему заданию в списке, а не первому.Вот почему необходима первая часть этих условий, т.е. в этом примере shoppingJob == null
бит
if (shoppingJob == null && job.isShopping()) {
3).Нет необходимости писать if, вложенный в предложение else, вы можете просто использовать else if
, если вам нужен условный оператор else.Хотя в этом случае для точного соответствия логике не следует использовать else
вообще (в исходном коде Streams, если задание вернуло значение true для isShopping
и isDelivery
, одно и то же задание может быть назначено обоимпеременные, но если вы используете здесь другое, которое может быть назначено только одному)
Таким образом, вместо этого
else {
if (deliveryJob == null && (job.isDelivery() || job.isRanger())) {
Вы можете просто использовать оператор if (без else)
if (deliveryJob == null && (job.isDelivery() || job.isRanger())) {
4).Наконец, в исходном коде, который вы пытаетесь воспроизвести, deliveryJob
было назначено заданию, которое вернуло true для isDelivery()
или isRanger()
.В вашем цикле for вы проверяли только isDelivery()
Надеюсь, что это поможет.