несовместимые типы: не существует экземпляра(ов) переменной(ов) типа F,T, чтобы java.util.Коллекция соответствует java.util.Set

#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;
            }
        });