【问题标题】:Remove Duplicates With Stream Distinct使用 Stream Distinct 删除重复项
【发布时间】:2022-01-12 12:57:44
【问题描述】:
  @Override
    public List<ExpenseListingDTO> getExpenseListByServiceFileId(Long serviceFileId) {

        if (Long.valueOf(serviceFileId) != null) {
            List<ExpenseListDetail> expenseListDetail = expenseListDetailRepository.findByServiceFileId(serviceFileId);
            List<ExpenseList> expenseList = expenseListRepository.findByExpenseListDetailListIn(expenseListDetail);
            //
            List<ExpenseListingDTO> expenseListDtoList = expenseListMapper.expenseListDTOToExpenseListingDTO(expenseListMapper.entityListToDtoList(expenseList));
            expenseListDtoList.parallelStream().forEach(dto -> {
                dto.setTotalAmount(
                        expenseListDetail.stream().filter(s -> s.getOperationType().equals(OperationType.NEW_EXPENSE.getValue()) || s.getOperationType().equals(OperationType.EXPENSE_RETURN.getValue()))
                                .filter(s -> !s.getStatus().equals(ExpenseListDetailStatus.PASSIVE.getValue())).map(ExpenseListDetail::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add));

            });
            return expenseListDtoList.stream()
                    .distinct()
                    .collect(Collectors.toList());
        }
        return Collections.emptyList();
    }

此函数返回一个列表。但是我的输出中有一些相同的列表。我想删除重复项。但它没有用。这里有什么问题?

【问题讨论】:

  • 返回集合而不是列表返回费用ListDtoList.stream() .distinct() .collect(Collectors.toSet())
  • 它应该返回列表。我不能使用 .toSet :(
  • 您可以将该集合转换为列表。
  • 可以添加ExpenseListingDTO的完整代码吗?你实现equals()方法了吗?

标签: java distinct


【解决方案1】:

请查看并实现ExpenseListingDTO#equalsExpenseListingDTO#hashCode 方法。 如果ExpenseListingDTO 对象相同,则这些方法应反映这一点。

编辑: 根据 cmets 的要求,我可以找到覆盖这些内容的指南 here

public class ExpenseListingDTO {

....

@Override
public boolean equals(Object o) {

    // If the object is compared with itself then return true 
    if (o == this) {
        return true;
    }

    /* Check if o is an instance of ExpenseListingDTO or not
      "null instanceof [type]" also returns false */
    if (!(o instanceof ExpenseListingDTO)) {
        return false;
    }
     
    // typecast 
    ExpenseListingDTO expenseListingDTO = (ExpenseListingDTO) o;
     
    // compare other member variables, etc...
    return this.XX == expenseListingDTO.XXX;
}
}

【讨论】:

  • 作为评论会更好
  • 我同意并尝试过,但目前我无法评论问题,sry
  • 看不清楚。我不知道这个哈希码方法。你能说得更具体些吗?
  • 我在我的 ExpenseListingDTO 上添加了 @EqualsAndHashCode(of = "id") 注释,它起作用了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多