Конвертация списка объектов с условным отбором

Сначала вычислите y, затем отфильтруйте чётные значения и создайте B. Промежуточный long защищает умножение на 3 от переполнения int.

Короткий ответ

Что ответить на собеседовании

Сначала вычислите y, затем отфильтруйте чётные значения и создайте B. Промежуточный long защищает умножение на 3 от переполнения int.

Подробный разбор

Ответ с пояснениями

Условие

Имеется коллекция экземпляров класса A. Требуется сформировать новую коллекцию объектов класса B, где значение поля B.y вычисляется по формуле 3 * A.x / 2. При этом в результирующую коллекцию попадают только те элементы, у которых полученный B.y является чётным числом.

public class A { public int x; }
public class B {
    public int y;
    public B(int y) { this.y = y; }
}

List<A> listA = List.of(...);
List<B> listB = listA. ...

Ответ

Сначала вычислите y, затем отфильтруйте чётные значения и создайте B. Промежуточный long защищает умножение на 3 от переполнения int.

List<B> listB = listA.stream()
        .mapToLong(a -> 3L * a.x / 2)
        .filter(y -> y % 2 == 0)
        .mapToObj(y -> new B(Math.toIntExact(y)))
        .collect(java.util.stream.Collectors.toList());

Деление целочисленное, с округлением к нулю. Если подходящий результат не помещается в поле int, Math.toIntExact бросит ArithmeticException вместо тихого искажения. Контракт предполагает ненулевые список и элементы. Время O(n), память O(k) для отобранных объектов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее