【问题标题】:What is the best way to create a List of "unique" objects in Java [duplicate]在Java中创建“唯一”对象列表的最佳方法是什么[重复]
【发布时间】:2016-08-03 00:05:22
【问题描述】:

我正在尝试创建一个唯一列表。我不能使用“Set”,因为我需要在迭代时分配一些值。

现在我这样做是为了创建一个唯一的列表。有谁知道更好的方法吗?

List<Thing> things = previousThings.stream()
                       .collect(Collectors.toSet()).stream()
                       .collect(Collectors.toList());

我在想,如果我将它转换为一个集合并返回一个列表,它将消除任何重复的条目。我认为它需要是一个列表,以便我可以使用“List.set(..)”根据我的存储库中可能已经存在的内容进行更新。

for(int i = 0; i < things.size(); i++) {
  if(things.get(i).id == null) {
    existingThing = thingRepository.getByName(things.get(i).getName());
    if(existingThing != null) {
      things.set(i, existingThing);
    } else {
      things.set(i, thingRepository.save(things.get(i));
    }
  }
}

【问题讨论】:

  • .distinct()替换.collect(Collectors.toSet()).stream()
  • 这通常可以工作,但我应该提到我需要使用与 .equals() 不同的方法进行比较,因为它使用 id 并且我正在寻找唯一的名称。是否有类似的方法可以让您提供 lambda 进行比较? @LouisWasserman
  • 什么叫“独一无二”?基于对象equals() 方法?它们是不可变的吗?
  • 我希望它们基于 thing.name @Ivr123 是独一无二的

标签: java list set unique java-stream


【解决方案1】:

我之前认为我无法使用 .distinct() 因为它使用基于“Thing.id”的 .equals() 并且某些“事物”没有“我还没有。然后我意识到,在 forLoop 结束时,存储库会为所有内容分配一个 id。

List<Thing> things = previousThings;
for(int i = 0; i < things.size(); i++) {
  if(things.get(i).id == null) {
    existingThing = thingRepository.getByName(things.get(i).getName());
    if(existingThing != null) {
      things.set(i, existingThing);
    } else {
      things.set(i, thingRepository.save(things.get(i));
    }
  }
}
List<Thing> distinctThings = things.stream().distinct().collect(Collectors.toList);

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2011-08-26
    • 2016-04-13
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多