Что ж, метод Set.add () возвращает логическое значение, указывающее, был ли новый элемент успешно добавлен в набор. Если он возвращает false, это потому, что элемент уже был там. Исходя из этого, вы можете легко написать свой алгоритм. Уродливой части приходится повторять набор для обновления значения, верно?
if(!edges.add(newEdge)){
Iterator<Edge> iter = edges.iterator();
while(iter.hasNext()){
Edge edge = iter.next();
if(edge.equals(newEdge)){
edge.updateWeight(newEdge.getWeight()); //this.weight+=moreWeight
}
}
}
Исходя из этого, я предполагаю, что то, что вы хотите, это просто способ украсить весь этот итерационный шаблонный код.
Мне нравится решение, использующее LambdaJ Collections для обновления веса существующего Edge.
if (!edges.add(newEdge)) {
with(edges).first(is(newEdge)).updateWeight(newEdge.getWeight());
}
Я не знаю, что вы ищете, но такой подход будет состоять из трех строк кода. Довольно просто с моей точки зрения.
Я написал небольшой пример, чтобы лучше проиллюстрировать идею:
Jedi obiwan = new Jedi("Obiwan", 30, 40); // name, age and power
Jedi luke = new Jedi("Luke", 18, 25);
Jedi mace = new Jedi("Mace-Windu", 100, 450);
Jedi yoda = new Jedi("Yoda", 150, 1000);
Jedi obiAgain = new Jedi("Obiwan", 11, 40);
Set<Jedi> jedis = new HashSet<Jedi>(asList(obiwan, luke, mace, yoda));
if (!jedis.add(obiAgain)) {
with(jedis).first(is(obiAgain)).updatePower(obiAgain.getPower());
}
System.out.println(jedis);