0

我有一个具有以下属性的对象类:

@Slf4j
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class M3MachineSale {

    private Integer OPCSHC;
    private String OPITNO;
    private String OPTRDT;
    private Integer OPIVQT;

}

我想删除所有重复项。我使用过.distinct(),但它不会删除重复项,只会将列表中的重复项归还给我。

// Remove duplicates and objects with Product = PANT L
List<M3MachineSale> updatedM3MachineSaleList = m3MachineSaleList.stream()
                .filter(m3MachineSale -> !m3MachineSale.getOPITNO().equals("PANT L"))
                .collect(Collectors.toList());

我在做什么?我知道我有一些具有相同属性的对象,但我想从列表中删除这些对象,而不是返回重复项。

输入列表:

M3MachineSale(OPCSHC=123, OPITNO=5562, OPTRDT=20200821, OPIVQT=1)
M3MachineSale(OPCSHC=123, OPITNO=5562, OPTRDT=20200821, OPIVQT=1)
M3MachineSale(OPCSHC=456, OPITNO=3497, OPTRDT=20200821, OPIVQT=15)
M3MachineSale(OPCSHC=789, OPITNO=6663, OPTRDT=20200821, OPIVQT=4)
M3MachineSale(OPCSHC=456, OPITNO=3497, OPTRDT=20200821, OPIVQT=15)

输出应该是:

M3MachineSale(OPCSHC=123, OPITNO=5562, OPTRDT=20200821, OPIVQT=1)
M3MachineSale(OPCSHC=456, OPITNO=3497, OPTRDT=20200821, OPIVQT=15)
M3MachineSale(OPCSHC=789, OPITNO=6663, OPTRDT=20200821, OPIVQT=4)

我试过这样做来查找重复项:

    private <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
    Map<Object, Boolean> seen = new ConcurrentHashMap<>();
    return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.FALSE) == null;
}

它返回了一个我有 605 个重复项的列表。白洞的例子

知道我该怎么做吗?感谢您的帮助!

4

2 回答 2

1

在您的 lombok 注释圣诞树中,您忘记了@EqualsAndHashCode哪些原因使重复数据删除成为不可能。

我建议你把你的批次减少到能@Data @Slf4j @NoArgsConstructor @AllArgsConstructor做到这一切的程度。

于 2020-08-25T15:26:09.777 回答
0

试试这个方法。我能够在 collect() 之前使用 distinct() 删除重复项。

List<M3MachineSale> updatedM3MachineSaleList = m3MachineSaleList.stream()
    .filter(m3MachineSale  -> !m3MachineSale.getOPITNO().equals("PANT L"))
    .distinct().collect(Collectors.toList());

这里的工作示例https://onlinegdb.com/BJA-h5z7P

于 2020-08-25T14:11:37.463 回答