Статьи

Изменение переменных внутри лямбды

Иногда мы сталкиваемся с ситуацией, в которой мы хотим изменить переменную внутри лямбда-выражения, но когда мы пытаемся это сделать, мы получаем ошибку во время компиляции, говорящую: 

Переменная внутри Lambda должна быть Final или Effective Final.

Давайте рассмотрим пример задачи, в которой нам нужно было бы изменить переменную внутри лямбда-выражения .

Ромзо работает в FedEx. FedEx использует предварительные контейнеры переменного размера (размер первого элемента + 6 ), в зависимости от первого элемента, вставленного в него. Предположим, мы вставили первый элемент весом 5, тогда контейнер может принимать элементы до веса 5 + 6 , то есть 11.

Нам выдаются предметы   1, 2, 3, 21, 7, 12, 14, 21, и нам нужно найти минимальное количество контейнеров, необходимое для отправки нашей партии.

Решение:
есть элементы с весами {  1, 2, 3, 21, 7, 12, 14, 21 }. Это можно разбить на 3 контейнера: {  1,2,3,7 }, {  12,14 } и {  21,21 }.

Каждый контейнер будет содержать предметы весом в единицах минимального веса товара + 6.

объяснение

Первый контейнер содержит предметы весом 1,2,3 и 7 (вес до 7, т.е. 1 + 6)
. Второй контейнер содержит предметы весом 12,14 единицы. (весит до 18, т.е. 12 + 6 = 18)
. Третий контейнер вмещает предмет весом 21,21 единицы. (вес до 27, т.е. 21 + 6 = 27)


Вам также может понравиться:
Лямбда-выражения в Java 8 .

Одно решение без лямбды: 


Джава





xxxxxxxxxx
1
15


 

1
 public static void main(String[] args) {

2
int [] items = {1, 2, 3, 21, 7, 12, 14, 21};

3
int count = 1;

4
Arrays.sort(items); //Sort the items ascending by weight

5
int currentWeight = items[0];

6
for(int weight : items)

7
{

8
if(!(weight <= currentWeight+6))

9
{

10
count++;

11
currentWeight = weight;

12
}

13
}

14
System.out.println(count);

15
 }


Теперь, когда мы пытаемся решить вышеуказанную проблему с помощью лямбды и потока, мы беспокоимся об обновлении  переменной count внутри нашей лямбды.

Но мы не можем обновить поле, объявленное final:


Джава





xxxxxxxxxx
1



1
int x;

2
x = 4; //value is never changed ever, so kind of make=ing it effectively final.

3
4
A keyword before a variable makes it final and no final keyword before a variable meke it effectively final provided we never change its value.


Дальнейшее чтение