Так как за неделю, никто не ответил на вопрос - придется ответить самому. Это немного модифицированный пример из книги "И. Н. Блинов
В. С. Романчик 'Java from EPAM'" (стр. 217) того, что хотя переменные, которые использует лямбда-выражение, не могут быть изменены (т.к. значения переменных фиксируются замыканием и если попробовать прямо изменить значения strNum и count в методе, то это вызовет
ошибку компиляции при попытке их применения в лямбда-выражении), это ограничение можно обойти, если обновлять значение переменных внутри другой структуры данных, например массива.
Что касается результатов выполнения указанного кода, то тут все просто:
- в первой строчке метода main() мы присваиваем ir значение объекта типа Function (функциональный интерфейс), т.е. в данном случае, значению t -> Integer.valueOf(strNum + t)+ ++count[0];
- во второй строчке метода main() мы применяем метод R apply(T t) данного интерфейса, который принимает объект типа T и воз-
вращает объект типа R. Его задача: выполнить действие над объектом одного типа и возвратить объект другого типа. В данном случае задача лямбда-выражения, взять объект типа String и преобразовать в объект типа Integer. В качестве объекта типа String для лямбда-выражения выступает конкатенация двух объектов: String strNum = "3" и String, который мы передаем как аргумент методу apply(T t), в данном случае это "5". Получается ==> "3" + "5" ==> "35" который преобразуется в Integer 35. К 35 прибавляется первый элемент массива int[] count, которому мы сначала присваиваем значение 1, в следующей строчке прибавляем еще 1 и в окончательном выражении, перед тем как прибавить к 35, прибавляем еще 1, итого 35 + 3 = 38, которые выводятся в консоль в третьей строчке метода main().