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