Сравнение List<Integer> с целочисленным объектом с использованием Java Stream

У меня проблемы с использованием потоков в 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

Я конвертирую строку в целочисленный объект и сравниваю ее со списком. Где я ошибаюсь?

В вызове равенства вы сравниваете строку с целым числом. Это всегда будет возвращать false.

ControlAltDel 08.04.2024 17:40
Stream.of(list) создаст поток из одного элемента — самого списка; не поток содержимого списка -- попробуйте list.stream().... -- документация: "Возвращает последовательный поток, содержащий один элемент". (выделено мной)
user85421 08.04.2024 17:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы используете Stream.of(List). В результате у вас есть поток из одного элемента, и этот элемент — список. И конечно, ваш список не равен числу.

userObj.getUserDocIdsToView().stream().anyMatch(num -> Objects.equals(num, Integer.valueOf(documentId))));

И не забывайте о потенциальных NPE, проверьте, что этот пользовательский объект и docIdsToView не равны нулю. Или используйте Optional

Другие вопросы по теме