Функциональные интерфейсы, лямбды и Stream API
Задачи на использование появившихся в Java 8 функциональных возможностей языка. Данная тема является довольно сложной сама по себе и поэтому требует от решающего определённого уровня подготовки.
Задача 1
Дан следующий код:
class Model {
Long id;
public Model(Long id) { this.id = id; }
public Long getId() { return id; }
}
public class Solution {
public static void main(String[] args) {
List<Model> models = Arrays.asList(new Model(1l), new Model(1l), new Model(2l), new Model(3l));
if (/*SOLUTION*/) {
System.out.println("Some models have the same Id.");
}
}
}
На место строки /*SOLUTION*/ впишите решение, которое проверит, что список models содержит объекты класса Model с повторяющимися Id. Используйте Stream API.
Задачу можно решить с помощью следующего выражения:
models.stream().map(Model::getId).distinct().count() < models.size()
Метод map() превратит поток объектов класса Model в поток Long'ов с соответствующими id (1,1,2,3), полученными с помощью переданного в map метода Model::getId, применённого к каждому элементу списка.
Метод distinct() "склеит" одинаковые id: 1,1,2,3 → 1,2,3
Метод count() посчитает количество оставшихся различных элементов.
В общем случае, если список не содержит одинаковых id, то в результате склейки количество элементов не поменяется и будет равно models.size(), но в нашем примере склейка уменьшила количество элементов, оно стало меньше количества элементов списка и соответственно условие оказалось выполнено.
Задача 2
Следующим образом можно в одной строке создать и инициализировать литералами массив целых чисел:
Integer[] intArray = new Integer[]{1,2,3,4,5};
Напишите код, который позволит похожим образом в одной строке создать и инициализировать литералами список (List<Integer>) целых чисел. Использовать Arrays.asList() нельзя.
Решение весьма простое:
List<Integer> intList = Stream.of(1,2,3,4,5,6).collect(Collectors.toList());
Метод Stream.of() позволяет создать стрим чего угодно. Собрать это что-угодно в список -- задача метода collect() с соответствующим аргументом.