Я вызываю библиотечный метод, который возвращает необработанный Stream
. Я знаю тип элементов в потоке и хочу собрать их в коллекцию с объявленным типом элемента. Каков хороший или не очень ужасный способ сделать это?
Минимальный воспроизводимый пример
Ради воспроизводимого примера предположим, что я хочу вызвать этот метод:
@SuppressWarnings("rawtypes")
static Stream getStream() {
return Stream.of("Example");
}
Я надеялся, что это сработает, и я не понял, почему это не так:
List<String> stringList = getStream().map(s -> (String) s).collect(Collectors.toList());
Я получаю сообщение Несоответствие типов: невозможно преобразовать объект в список. Почему?
Обходной путь
Непроверенный бросок работает. Чтобы сузить бит, который необходимо пометить как преднамеренно непроверенный, мы можем сделать
@SuppressWarnings("unchecked")
Stream<String> stringStream = getStream();
List<String> stringList = stringStream.collect(Collectors.toList());
Как в Java 8, так и в Java 11 возвращаемый список представляет собой java.util.ArrayList
и содержит ожидаемый элемент String
.
Что мой поиск дал или нет
Я попытался найти в своей поисковой системе такие термины, как java collection raw stream. Ни к чему полезному это меня не привело. Существует закрытая ошибка Java (ссылка внизу), в которой упоминается, что как только вы работаете с необработанными типами, все становится необработанным. Но эта полностью необработанная версия тоже не работает:
List stringList = getStream().collect(Collectors.toList());
Я по-прежнему получаю сообщение Несоответствие типов: невозможно преобразовать объект в список. Как так?
Мы кодируем для Java 8 (еще немного).
Я знаю, что в этом вопросе есть что-то основанное на мнении. Я все еще надеюсь, что вы можете предоставить мне некоторые факты, которые помогут мне написать код, который в целом будет считаться более красивым.
Предыстория: Гибернация 5
Метод, который я хочу вызвать, это org.hibernate.query.Query.getResultStream()
для необработанного Query
(параметр типа Query
отсутствует). Я хочу получить поток, потому что у меня есть особые требования к типу коллекции, в которую я собираю. В моем производственном коде я использую Collectors.toCollection()
(а не Collectors.toLlist()
, как в примере в этом вопросе). Кстати, при написании этого вопроса я нашел способ убедить Hibernate вернуть типизированный поток. Я все еще нашел вопрос достаточно интересным, чтобы опубликовать.
Связь
- Проблема с приведением внутренних лямбда-выражений для метода java.util.stream.Stream.map в базе данных ошибок Java
((Stream<String>)getStream())
- person Sweeper   schedule 09.01.2021javac
выводитNote: Main.java uses unchecked or unsafe operations.
для меня. - person Slaw   schedule 09.01.2021Stream
вStream<?>
. Это единственный способ избавиться от необработанного типа без операции unchecked. После этогоmap
можно использовать по назначению. - person Holger   schedule 10.01.2021