Предикат фильтра Java Stream, допускающий неправильные элементы [дубликат]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Предикат фильтра Java Stream, допускающий неправильные элементы [дубликат]

Сообщение Anonymous »

товарищи.
Короче: мне нужно отфильтровать список, чтобы в нем были только те, у кого есть различия в некоторых полях.
Это потому, что мне нужно чтобы показать аудитору различия в объекте на протяжении всего времени.
У меня есть этот псевдокласс, где в моем приложении представлена ​​модель Hibernate Envers:< /p>

Код: Выделить всё

class SystemAudit {
Int id;
String descriptionFieldA;
String descriptionFieldB;
String descriptionFieldC;

// Constructor, gets and sets
}
После загрузки из базы данных у меня есть что-то вроде этого:

Код: Выделить всё

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"));
Когда я прошу удалить все элементы, имеющие одинаковое значение для какого-либо свойства, это работает хорошо, посмотрите:

Код: Выделить всё

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));
}
}
(Это вышеописанное было вдохновлено https://stackoverflow.com/a/27872852/13635010)
Результат выглядит следующим образом:

Код: Выделить всё

systemAuditListFiltered
содержимое:

Код: Выделить всё

(0, "A0", "B0", "C0")
(3, "A1", "B1", "C0")
(6, "A2", "B2", "C0")
Но если я свяжу Predicate, это будет похоже на то, что мой filtrarPorArgumento позволит недействительным элементам, посмотрите:

Код: Выделить всё

systemAuditListFiltered = systemAuditList.stream()
.filter(StreamUtil.filtrarPorArgumento(SystemAudit::getDescriptionFieldA)
.or(StreamUtil.filtrarPorArgumento(SystemAudit::getDescriptionFieldB))
.or(StreamUtil.filtrarPorArgumento(SystemAudit::getDescriptionFieldC)))
.collect(Collectors.toList());
Содержимое, фильтруемое системойAuditList:

Код: Выделить всё

(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 будет выглядеть следующим образом:

Код: Выделить всё

(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")
Изменить:
Воспроизводимый код:
https://onecompiler.com/java/42zfp99xj

Подробнее здесь: https://stackoverflow.com/questions/792 ... rong-itens
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»