#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, также не исключит нули, которые, как предполагается, желательны при проверке экземпляра. Есть много способов сделать это.