Как изменить и проверить, если изменение в Java - 8? - PullRequest
0 голосов
/ 17 мая 2018

Я изменяю объект, используя java-8

users.stream().filter(u -> u.count > 0).forEach(u -> u.setProperty("value"))

Однако я хочу понять, был ли какой-либо объект изменен или нет ... то есть, я хочу получить логическое возвращаемое значение, хотя это недействительно.

Есть ли способ сделать это?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Добавить звонок на peek():

AtomicBoolean modified = new AtomicBoolean();
users.stream()
    .filter(u -> u.count > 0)
    .peek(u -> modified.set(true))
    .forEach(u -> u.setProperty("value"))

Если какой-либо элемент пройдет через фильтр, modified.get() вернет true.

Необходимо использовать AtomicBoolean (или что-то подобное), потому что ссылки, используемые в лямбдах, должны быть эффективно окончательными .

0 голосов
/ 17 мая 2018

Если я правильно вас понял, вы хотите знать, были ли какие-либо совпадения при выполнении операции. Вы можете просто использовать два утверждения.

boolean anyMatch = users.stream().anyMatch(u -> u.count > 0);
if(anyMatch) users.stream().filter(u -> u.count > 0).forEach(u -> u.setProperty("value"));

Поскольку anyMatch останавливается на первом совпадающем элементе, избыточная работа будет выполняться только в том случае, если перед первым совпадением существует длинный префикс несовпадающих элементов.

Если это проблема, вы можете использовать

Spliterator<User> sp = users.stream().filter(u -> u.count > 0).spliterator();
boolean anyMatch = sp.tryAdvance(u -> u.setProperty("value"));
sp.forEachRemaining(u -> u.setProperty("value"));

вместо.

0 голосов
/ 17 мая 2018

Поскольку это трудоемкая операция, ее можно использовать только с методами, которые на самом деле ничего не возвращают;то есть использование forEach обеспечивает работу терминала, в которой вы не получите возвращаемое значение.

Если вы хотите проверить, что свойство установлено так, как вы хотите, вы должныпридется снова проверять элементы.

users.stream().filter(u -> u.count > 0)
              .allMatch(u -> u.getProperty().equals("value"));

Хотя это говорит о паранойе больше, чем о чем-либо еще;если setProperty не имеет какого-либо другого побочного эффекта, который не выставлен здесь , то установщик должен всегда установить значение.Я написал бы выше в модульном тесте для целей проверки, но не в производственном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...