товарищи.
Короче: мне нужно отфильтровать список, чтобы в нем были только те, у кого есть различия в некоторых полях.
Это потому, что мне нужно чтобы показать аудитору различия в объекте на протяжении всего времени.
У меня есть этот псевдокласс, где в моем приложении представлена модель Hibernate Envers:< /p>
List systemAuditListFiltered = systemAuditList.stream()
.filter(StreamUtil.filtrarPorArgumento(SystemAudit::getDescriptionFieldA))
.collect(Collectors.toList());
public class Streamutil {
public static Predicate filtrarPorArgumento(Function argumento) {
Set argsEncontrados = ConcurrentHashMap.newKeySet();
return t -> argsEncontrados.add(argumento.apply(t));
}
}
(0, "A0", "B0", "C0")
(1, "A0", "B1", "C0")
(2, "A0", "B1", "C0") // This is a wrong item
(3, "A1", "B1", "C0")
(4, "A1", "B2", "C0")
(6, "A2", "B2", "C0")
(7, "A2", "B3", "C1")
(8, "A2", "B3", "C1") // This is a wrong item
Просто помните: я НЕ сравниваю SystemAudit.id
Где я ошибаюсь?
После загрузки приведенного выше systemAuditList я ожидаю, что содержимое systemAuditListFiltered будет выглядеть следующим образом:
товарищи. Короче: мне нужно отфильтровать список, чтобы в нем были только те, у кого есть различия в некоторых полях. Это потому, что мне нужно чтобы показать аудитору различия в объекте на протяжении всего времени. У меня есть этот псевдокласс, где в моем приложении представлена модель Hibernate Envers:< /p> [code]class SystemAudit { Int id; String descriptionFieldA; String descriptionFieldB; String descriptionFieldC;
// Constructor, gets and sets } [/code] После загрузки из базы данных у меня есть что-то вроде этого: [code]List systemAuditList = new ArrayList(); systemAuditList.add(new SystemAudit(0, "A0", "B0", "C0")); systemAuditList.add(new SystemAudit(1, "A0", "B1", "C0")); systemAuditList.add(new SystemAudit(2, "A0", "B1", "C0")); systemAuditList.add(new SystemAudit(3, "A1", "B1", "C0")); systemAuditList.add(new SystemAudit(4, "A1", "B2", "C0")); systemAuditList.add(new SystemAudit(5, "A1", "B2", "C0")); systemAuditList.add(new SystemAudit(6, "A2", "B2", "C0")); systemAuditList.add(new SystemAudit(7, "A2", "B3", "C1")); systemAuditList.add(new SystemAudit(8, "A2", "B3", "C1")); [/code] Когда я прошу удалить все элементы, имеющие одинаковое значение для какого-либо свойства, это работает хорошо, посмотрите: [code]List systemAuditListFiltered = systemAuditList.stream() .filter(StreamUtil.filtrarPorArgumento(SystemAudit::getDescriptionFieldA)) .collect(Collectors.toList());
public class Streamutil { public static Predicate filtrarPorArgumento(Function argumento) { Set argsEncontrados = ConcurrentHashMap.newKeySet(); return t -> argsEncontrados.add(argumento.apply(t)); } } [/code] (Это вышеописанное было вдохновлено https://stackoverflow.com/a/27872852/13635010) Результат выглядит следующим образом:[code]systemAuditListFiltered[/code] содержимое: [code](0, "A0", "B0", "C0") (3, "A1", "B1", "C0") (6, "A2", "B2", "C0") [/code] Но если я свяжу Predicate, это будет похоже на то, что мой filtrarPorArgumento позволит недействительным элементам, посмотрите: [code]systemAuditListFiltered = systemAuditList.stream() .filter(StreamUtil.filtrarPorArgumento(SystemAudit::getDescriptionFieldA) .or(StreamUtil.filtrarPorArgumento(SystemAudit::getDescriptionFieldB)) .or(StreamUtil.filtrarPorArgumento(SystemAudit::getDescriptionFieldC))) .collect(Collectors.toList()); [/code] Содержимое, фильтруемое системойAuditList: [code](0, "A0", "B0", "C0") (1, "A0", "B1", "C0") (2, "A0", "B1", "C0") // This is a wrong item (3, "A1", "B1", "C0") (4, "A1", "B2", "C0") (6, "A2", "B2", "C0") (7, "A2", "B3", "C1") (8, "A2", "B3", "C1") // This is a wrong item [/code] Просто помните: я НЕ сравниваю SystemAudit.id Где я ошибаюсь? После загрузки приведенного выше systemAuditList я ожидаю, что содержимое systemAuditListFiltered будет выглядеть следующим образом: [code](0, "A0", "B0", "C0") (1, "A0", "B1", "C0") (3, "A1", "B1", "C0") (4, "A1", "B2", "C0") (6, "A2", "B2", "C0") (7, "A2", "B3", "C1") (8, "A2", "B3", "C1") [/code] Изменить: Воспроизводимый код: https://onecompiler.com/java/42zfp99xj