После сортировки выводит не тот элемент, который нужен

146
06 марта 2022, 06:00

В дополнении к вопросу Что можно закастить в SortedSet?, нашел решение, но выдает другую ошибку! Почему, не могу понять...

Collection<User> users = new HashSet<>(source);
        List<User> forReturn = new ArrayList<>(users);
        forReturn.stream().sorted();
        return forReturn.get(users.size() - 1);
Answer 1

Стрим так не работает. это все таки уже функционалка. Мало того, что стрим ленивый, так он еще выводит результат исключительно через терминальные вызовы, посему для вывода в лист он создаст вам новую коллекцию. Выглядит это так:

Collection<User> users = new HashSet<>(source);
List<User> forReturn = new ArrayList<>(users);
return forReturn.stream().sorted().collect(Collectors.toList()).get(users.size() - 1);

Однако, вы должны понимать, что это очень плохая идея. Вы ищите 1 элемент по определенному признаку, для этого сортировать нерационально, ибо ресурсозатратно. Мало того, если вы не имплеиментируете Comparable либо не напищите Comparator для класса User, то получите ошибку во всех случаях сортировки (именно поэтому вы получааете класскаст для сортированной коллекции).

Если вы хотите использовать стрим, то лучше сделать так

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class User {
    private final String name;
    private final Integer age;
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public Integer getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "User{" + "name=" + name + ", age=" + age + '}';
    }
    public static void main(String[] args) {
        final List<User> list = Arrays.asList(new User("Igor", 25), new User("Masha", 32), new User("Dasha", 22));
        User user = list.stream().max(Comparator.comparing(User::getAge, Comparator.reverseOrder())).get();
        System.out.println(user);
    }
}
READ ALSO
replaceAll и обратные слэши

replaceAll и обратные слэши

Сегодня занимался в Java проблемой кавычек в SQL запросах (инъекция) и обнаружил, что чтобы после результата функции получить \', я должен написать...

88
как переназначить ссылку this

как переназначить ссылку this

Как сделать чтобы методе класса можно было перекинуть ссылку объекта на созданный новый объект

93
Как добавить несколько фрагментов в один контейнер?

Как добавить несколько фрагментов в один контейнер?

Пытаюсь добавить несколько фрагментов в один контейнер, но в результате получается так, как если бы добавлял без цикла первый фрагментГде...

80
Задача выполняется только один раз

Задача выполняется только один раз

Решил реализовать в коде обновление информации по API запросу через определенный интервал времениСразу по нажатию кнопки информация приходит...

93