Лямбда-выражение Java для вложенных циклов с условным
Я новичок в лямбда-выражениях и пытаюсь использовать их, чтобы уменьшить следующий код до лямбда-эквивалента. Я просмотрел reduce и flatMap и forEach, а также несколько других вещей, но я, очевидно, что-то упускаю, потому что все, что я пытаюсь, либо синтаксически неверно, либо у меня нет ссылки на то, что мне нужно.
мне нужно провести анализ каждого элемента от всех других элементов в коллекции. Я закодировал это как вложенные циклы с a условный. После идентификации несоответствующих элементов выполняется вычисление с использованием обоих элементов. Наконец, мне нужна коллекция результатов для каждого сравнительного вычисления.
Итак, вот исходный код:
final List<Element> updated = new ArrayList<>(elements.size());
for (final Element first : elements) {
Attribute newAttribute = first.getAttribute();
for (final Element second : elements) {
if (!first.equals(second)) {
newAttribute = newAttribute.add(computeChange(first, second));
}
}
final Element newElement = new Element(first.getEntry(), newAttribute, first.getValue());
updated.add(newElement);
}
затем я попробовал много вариантов лямбда-выражений, самым простым из которых является:
elements.parallelStream()
.map(first -> new Element(first.getEntry(), first.getAttribute().add(
computeChange(first, second)), first
.getValue())).collect(Collectors.toList()));
очевидно, это неправильно, так как нет ссылки на вторую доступную мне и нет условия / фильтра для второго, не равного первый.
Как уменьшить этот вложенный цикл с условным возвращения коллекции в лямбда-выражение?
любая помощь очень ценится.
1 ответов
попробуй:
elements.stream()
.map(first -> {
Attribute newAttribute = elements.stream().filter(second -> !first.equals(second))
.map(second -> computeChange(first, second))
.reduce(first.getAttribute(), (a, b) -> a.add(b))
return new Element(first.getEntry(), newAttribute, first.getValue());
}).collect(Collectors.toList()));