#java #collections #transform
Вопрос:
Я пытаюсь преобразовать список ComplexItem
в список их соответствующих идентификаторов Long
. Но получаю вышеприведенную ошибку, которая не исчезает даже после ввода getCollection()
вызова с (Collection<ComplexItem>)
Set<Long> ids = Collections2.transform(
getComplexItems(), new Function<ComplexItem, Long>() {
@Override public Long apply(final ComplexItem item) {
return item.id;
}
}));
public List<ComplexItem> getComplexItems() {
..............
}
Комментарии:
1. Почему бы просто не сделать
getComplexItems().stream().map(item -> item.id).collect(Collectors::toSet)
это ?2. @QBrute, который должен работать, но хотел знать, что не так в приведенном выше коде
Ответ №1:
Нет никаких оснований ожидать , что результат Collections2.transform
, которым является а Collection
, будет волшебным образом преобразован в а Set
. Это является причиной ошибки сопоставления типов в заголовке. Вам нужно будет либо явно преобразовать результат в набор, либо обойтись Collection
.
Поскольку вы уже используете Guava
, вам следует серьезно подумать ImmutableSet
, так что это
ImmutableSet<Long> ids
= ImmutableSet.copyOf(Collections2.transform(getComplexItems(), item -> item.id)));
Делая шаг назад, вспомните, что Гуава была создана до Java Stream
s. Как правило, предпочтительнее использовать встроенные языковые модули, а не стороннюю библиотеку, даже если она так же хороша, как Гуава. Другими словами, предпочитаю
getComplextItems().stream().map(item -> item.id).collect(toImmutableSet());
где toImmutableSet()
находится коллектор, определяемый ImmutableSet
.
Ответ №2:
вы неправильно импортировали функцию
попробуйте это
Collection<Long> ids = Collections2.transform(
getComplexItems(), new com.google.common.base.Function<ComplexItem, Long>() {
@Override public Long apply(final ComplexItem item) {
return item.id;
}
});