Функциональные интерфейсы, лямбды и 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() с соответствующим аргументом.