Существует ли объектная оболочка для примитивных значений, которая позволяет изменять их из лямбды?

Рассмотреть возможность:

boolean somethingHappened = false;
Runnable doHappen = () -> { somethingHappened = true; }

Вы не можете этого сделать, потому что somethingHappened не является окончательным. Смысл в том, что, как правило, вам не нужно изменять захваченные переменные из лямбда-области. Но, например, при использовании Stream.forEach в этом нет необходимости.

Конечно, я мог бы написать обертку:

class Wrap<T> 
{
    public T value;
}

А затем я бы получил доступ к somethingHappened.value и изменил это.

Мне просто интересно, существует ли уже такая оболочка в стандартной библиотеке Java. Я знаю только Optional, который неизменен. Я мог бы злоупотреблять массивом final boolean[] mutableBool = { false }, но это ужасно.

Да, то, что говорится в моем вопросе, я считаю немного ужасным. Но если я не получу ответа, я, вероятно, так и сделаю. Также, кстати, вы можете просто написать boolean[] x = { false };, здесь подразумевается новое.

Tomáš Zato 29.09.2022 14:31

Плохо, я невнимательно прочитал.

Dmytro 29.09.2022 14:33

Я не уверен, что это правильный способ сделать это, но классы в пакете java.util.concurrent.atomic работают.

Federico klez Culloca 29.09.2022 14:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не в библиотеке Java. Но для этого в Apache Commons Lang есть Mutable. Он предлагает подклассы для каждой из примитивных оболочек, но каждая из них является изменчивой (например, MutableInt, MutableBoolean и т. д.).

Вы можете рассмотреть, будет ли использование этого возможно для вас.


ОБНОВИТЬ

AtomicBoolean - еще один вариант. Это позволяет вам делиться им между потоками и обновлять логическое значение, которое оно содержит.


Мои 0,02 доллара. Всякий раз, когда мне нужно обновить переменную из лямбды, я бы сделал шаг назад и еще раз подумал, действительно ли мне нужно это делать, и правильно ли использовать лямбда в этом случае. До сих пор (AFAIR) мне никогда не приходилось прибегать к какому-либо подходу для преодоления ограничения, согласно которому переменные, используемые в лямбда-выражении, должны быть эффективно окончательными.

Я принимаю этот ответ, поскольку в стандартной библиотеке его нет, и в вашем ответе, по крайней мере, упоминается очень распространенная библиотека, в которой есть класс для этого. Что касается вашего .02, я обратился к этому в своем вопросе.

Tomáš Zato 01.10.2022 14:03

Я согласен, что Runnable мог представить больше сценариев, где это необходимо, но все же я думаю, что есть и другие варианты. Один из вариантов, который сразу приходит на ум, — это AtomicBoolean.

Thiyagu 01.10.2022 14:58

Не создаст ли это ненужное впечатление, что происходит какая-то многопоточность? Я также беспокоился, что у него есть накладные расходы.

Tomáš Zato 01.10.2022 15:16

Да, это может быть не самое интуитивно понятное решение, когда нет многопоточности. А многопоточности уже нет? У меня сложилось такое впечатление, что вы использовали Runnable, и я предположил, что существует несколько потоков, и каждый поток должен знать значение somethingHappened

Thiyagu 01.10.2022 15:34

Нет, мой случай как раз делал someList.stream().forEach()

Tomáš Zato 01.10.2022 16:15

Другие вопросы по теме