Сначала вычислите y, затем отфильтруйте чётные значения и создайте B. В Java целочисленное деление усекает к нулю; промежуточное умножение лучше выполнить в long.
Формирование списка B из списка A с отбором и преобразованием полей
Сначала вычислите y, затем отфильтруйте чётные значения и создайте B. В Java целочисленное деление усекает к нулю; промежуточное умножение лучше выполнить в long.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеются два класса A и B. Требуется получить список объектов B, построив его на основе существующего listA. При этом в результирующий список попадают только те элементы, у которых значение y чётное, а значение y рассчитывается по формуле y = 3 * a.x / 2.
public class A { public int x;}
public class B {
public int y;
public B(int y){this.y=y}
}
List<A> listA = List.of(....);
Lift<B> listB = listA
Необходимо выполнить фильтрацию и преобразование, используя возможности языка Java (например, Stream API) или любой другой подход, который позволяет получить требуемый список listB.
Ответ
Сначала вычислите y, затем отфильтруйте чётные значения и создайте B. В Java целочисленное деление усекает к нулю; промежуточное умножение лучше выполнить в long.
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());
Math.toIntExact явно отклоняет результат вне диапазона int вместо тихого переполнения. Здесь реализована математическая формула с целочисленным делением, а не переполнение выражения 3 * x в int. В исходнике также нужны точка с запятой в конструкторе B и List вместо Lift.