Если ваш vode
может быть true
для нескольких экземпляров ProductModel
(в противном случае, если вы ожидаете один true
- это еще проще, я дам это упражнение для вас), и вы хотите сохраните их всех, может быть, это то, что вы ищете:
List<ProductModel> models = List.of(
new ProductModel(1, 123, false),
new ProductModel(1, 123, true)); // just an example
Map<List<Integer>, List<ProductModel>> map = new HashMap<>();
models.forEach(x -> {
map.computeIfPresent(Arrays.asList(x.getMode(), x.getCode()),
(key, value) -> {
value.add(x);
value.removeIf(xx -> !xx.isVode());
return value;
});
map.computeIfAbsent(Arrays.asList(x.getMode(), x.getCode()),
key -> {
List<ProductModel> list = new ArrayList<>();
list.add(x);
return list;
});
});
map.values()
.stream()
.flatMap(List::stream)
.forEachOrdered(x -> System.out.println(x.getCode() + " " + x.getMode()));
где ProductModel
- это что-то вроде:
static class ProductModel {
private final int code;
private final int mode;
private final boolean vode;
// some other fields, getters, setters
}
Это не так тривиально для достижения. Сначала нужно выяснить, есть ли дубликаты, и действовать соответствующим образом только тогда, когда они найдены. map.computeIfAbsent
позаботится о том, чтобы вставить в карту ключи (Key
сделан из Code/Mode
, завернутого в Arrays::asList
- он корректно переопределяет hashCode/equals
).
Когда дубликат найден на основе этого Ключа, мы хотим действовать по нему через map.computeIfPresent
. «Действовать» тоже не тривиально, учитывая, что vode
может быть true
в нескольких случаях (да, это мое предположение). Вы не знаете, что vode
было добавлено в эту карту для предыдущего Ключа - это было false
? если так, то он должен быть удален. Но нынешний false
тоже? Если так, это должно быть также удалено.