Сначала вычислите 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) для отобранных объектов.