У меня проблемы с использованием потоков в Java. Наверное, я поступаю не так. Может кто-нибудь указать, что происходит не так.
У меня есть класс Java Users.java со списком следующим образом:
/////..............
private List<Integer> userDocIdsToView = new ArrayList<Integer>();
@Transient
public List<Integer> getUserDocIdsToView() {
return userDocIdsToView;
}
public void setUserDocIdsToView(List<Integer> userDocIdsToView) {
this.userDocIdsToView = userDocIdsToView;
}
...////
Я пытаюсь использовать это и сравнить этот список с целочисленным потоком, используя поток следующим образом:
@RequestMapping(value = {"getDoc/{documentId}"}, method = RequestMethod.POST)
public ResponseEntity<?> getDoc(HttpServletRequest req, @PathVariable(required = true) String documentId) {
try {
System.out.println("Inside getDoc "+documentId+" ->"+"List "+userObj.getUserDocIdsToView()+" - "+Stream.of(userObj.getUserDocIdsToView()).anyMatch(num -> Objects.equals(num, Integer.valueOf(documentId))));
if (documentId != null && userObj.getUserDocIdsToView().size() > 0 && Stream.of(userObj.getUserDocIdsToView()).anyMatch(num -> Objects.equals(num, Integer.valueOf(documentId)))) {
System.out.println("Passed the condition");
}
}
}
Приведенный выше код выглядит хорошо, но как только я его запускаю, системный вывод выглядит следующим образом:
Inside getDoc 31 ->List [31, 48, 57, 59, 66, 67, 68, 73, 89, 102, 251] - false
Я конвертирую строку в целочисленный объект и сравниваю ее со списком. Где я ошибаюсь?
Stream.of(list) создаст поток из одного элемента — самого списка; не поток содержимого списка -- попробуйте list.stream().... -- документация: "Возвращает последовательный поток, содержащий один элемент". (выделено мной)




Проблема в том, что вы используете Stream.of(List). В результате у вас есть поток из одного элемента, и этот элемент — список. И конечно, ваш список не равен числу.
userObj.getUserDocIdsToView().stream().anyMatch(num -> Objects.equals(num, Integer.valueOf(documentId))));
И не забывайте о потенциальных NPE, проверьте, что этот пользовательский объект и docIdsToView не равны нулю. Или используйте Optional
В вызове равенства вы сравниваете строку с целым числом. Это всегда будет возвращать false.