Поток Java добавляет результат вызова метода в другую коллекцию

#java #stream

#java #поток

Вопрос:

У меня есть ArrayList (без оператора diamond), в котором хранятся объекты типа UserHelper. Я хотел бы переписать код итератора в stream, но я не уверен, как добавить результат вызова метода в коллекцию. Вот мой код:

     List<AdminDto> result = new ArrayList<>();

    ArrayList userHelperAL = getUsersToAdd(start, num, usernameFilter, fullnameFilter);

    for (Iterator userIt = userHelperAL.iterator(); userIt.hasNext();) {
        // get the user
        UserHelper userHelper = (UserHelper) userIt.next();

        // get the user's permissions
        AdminDto userPermissionDto = getNewAdminDtoByConsolePermissions(userHelper);
        result.add(userPermissionDto);
    }
  

getNewAdminDtoByConsolePermissions Метод является частным методом в SomeService классе.

Здесь я пытаюсь переписать приведенный выше код для stream:

     userHelperAL.stream()
        .filter(obj -> obj instanceof UserHelper)
        .map(obj -> (UserHelper) obj)
        .map(SomeService::getNewAdminDtoByConsolePermissions)
        .collect(Collectors.toCollection(() -> result));
  

Ошибка, которую я получаю здесь: The type SomeService does not define getNewAdminDtoByConsolePermissions(Object) that is applicable here. кажется, что он пытается передать объект типа Object вместо UserHelper

Вот getNewAdminDtoByConsolePermissions метод:

 private AdminDto getNewAdminDtoByConsolePermissions(UserHelper userHelper) {
    long consolePermissions = userHelper.getConsolePermissions();

    // Add the user's permissions to the map
    Map<String, Boolean> permissionMap = getUserAdminPermissionMap();
    int index = 0;

    for (String key : permissionMap.keySet()) {
        // the value is hidden for legacy purposes
        permissionMap.put(key, someVALUE);
          index;
    }

    // build the dto 
    AdminDto resultDto = getAdminUserManagementPermissions(permissionMap);

    return resultDto;
}
  

Большое вам спасибо

Комментарии:

1. Почему это необработанный тип??????????? Это ArrayList переполнение стека????? Кстати, ваша ссылка на метод неверна, это не статический метод, поэтому вам нужно this:: .

2. Вам нужно показать нам getNewAdminDtoByConsolePermissions объявление метода, потому что именно здесь возникает ошибка!

3. обновлен вопрос, добавлено определение метода getNewAdminDtoByConsolePermissions

4. List<AdminDto> result = userHelperAL.stream() .filter(obj -> obj instanceof UserHelper) .map(obj -> (UserHelper) obj) .map(SomeService::getNewAdminDtoByConsolePermissions) .collect(Collectors.toList());

5. @Naman Тип SomeService не определяет getNewAdminDtoByConsolePermissions(объект), который применим здесь. Он пытается передать Object как param вместо отображенного UserHelper выше

Ответ №1:

Это более явно:

 userHelperAL.stream()
        .filter(UserHelper.class::isInstance)
        .map(UserHelper.class::cast)
        .map(SomeService::getNewAdminDtoByConsolePermissions)
        .collect(Collectors.toCollection(() -> result));
  

какую версию Java вы используете, поскольку в последних нескольких выпусках было внесено много незначительных изменений в вывод / стирание приведения.

Комментарии:

1. Я использую Java 8. Я думаю, что 221 выпуск. Я проверю приведение примерно через 1 час и дам вам знать, сработало ли это. На данный момент я создал метод, который принимает параметр (Object), а затем вызывает метод, который принимает параметр (UserHelper), неявно передавая объект в UserHelper

2. @AndrewT почему бы не написать что-то вроде:? java userHelperAL.stream() .map(obj -> getNewAdminDtoByConsolePermissions((UserHelper) obj)) .collect(Collectors.toCollection(() -> result));

3. @MikhailPashkov никакая реальная причина, кроме isInstance, также не исключит нули, которые, как предполагается, желательны при проверке экземпляра. Есть много способов сделать это.