不同的项目 List、Set、HashSet、Lambda、Java 8
Distinct items List, Set, HashSet, Lambda, Java 8
为了在 List
中获得 Distinct 项,我有三种选择
return new ArrayList<>(new HashSet<>(someTypeList));
return new HashSet<>(someTypeList).stream().collect(Collectors.toList());
return someTypeList.stream().collect(Collectors.toSet()).stream().collect(Collectors.toList());
您向我推荐了哪个选项,为什么?
如果有其他选择,请告诉我。
- 第一个选项
不保留列表的原始顺序,还必须构造集合然后复制到列表。
- 第一个选项优于第二个选项,因为流会影响性能。
- 优于第三个选项,
someTypeList.stream().distinct().collect(Collectors.toList())
所以如果订购不是问题,那么最好的选择会更好。
还有一些第三方库提供了更好的性能
ImmutableSet.copyOf(listInts).asList();
希望对您有所帮助。
你应该保持一致,不要混用不同的方法。
Collection API 方法使用
new ArrayList<>(new HashSet<>(someTypeList))
或
new ArrayList<>(new LinkedHashSet<>(someTypeList))
想保留订单时
然后是 Stream API 方法
someTypeList.stream().distinct().collect(Collectors.toList());
或
someTypeList.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
当您需要结果恰好是 ArrayList
时
当someTypeList
是普通的List
实现时,Collection方式不仅更简单,而且效率更高。 Stream API 在实现 distinct()
时无论如何在内部使用 HashSet
,但是 collect
操作会受到抽象的轻微影响,因为它没有关于预期数量的提示元素。相反,ArrayList
构造函数将简单地在传入的 HashSet
上调用 toArray
并将结果用作其后备数组。
当 someTypeList
是未知集合时,情况会发生变化。在某些场景下,Stream API 可能会利用源的特性来优化操作。如果源已经有不同的元素,比如 Set
,distinct()
的开销将被消除。如果源已排序,将使用不同的算法来识别重复项,不需要 HashSet
.
由于 Stream API 封装了实际的实现,它可能会在未来得到改进而无需调整客户端代码。相比之下,显式 Collection 操作将始终完全按照要求执行,永远不会从替代实施策略中受益。
为了在 List
return new ArrayList<>(new HashSet<>(someTypeList));
return new HashSet<>(someTypeList).stream().collect(Collectors.toList());
return someTypeList.stream().collect(Collectors.toSet()).stream().collect(Collectors.toList());
您向我推荐了哪个选项,为什么?
如果有其他选择,请告诉我。
- 第一个选项 不保留列表的原始顺序,还必须构造集合然后复制到列表。
- 第一个选项优于第二个选项,因为流会影响性能。
- 优于第三个选项,
someTypeList.stream().distinct().collect(Collectors.toList())
所以如果订购不是问题,那么最好的选择会更好。 还有一些第三方库提供了更好的性能
ImmutableSet.copyOf(listInts).asList();
希望对您有所帮助。
你应该保持一致,不要混用不同的方法。
Collection API 方法使用
new ArrayList<>(new HashSet<>(someTypeList))
或new ArrayList<>(new LinkedHashSet<>(someTypeList))
想保留订单时
然后是 Stream API 方法
someTypeList.stream().distinct().collect(Collectors.toList());
或someTypeList.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
当您需要结果恰好是ArrayList
时
当someTypeList
是普通的List
实现时,Collection方式不仅更简单,而且效率更高。 Stream API 在实现 distinct()
时无论如何在内部使用 HashSet
,但是 collect
操作会受到抽象的轻微影响,因为它没有关于预期数量的提示元素。相反,ArrayList
构造函数将简单地在传入的 HashSet
上调用 toArray
并将结果用作其后备数组。
当 someTypeList
是未知集合时,情况会发生变化。在某些场景下,Stream API 可能会利用源的特性来优化操作。如果源已经有不同的元素,比如 Set
,distinct()
的开销将被消除。如果源已排序,将使用不同的算法来识别重复项,不需要 HashSet
.
由于 Stream API 封装了实际的实现,它可能会在未来得到改进而无需调整客户端代码。相比之下,显式 Collection 操作将始终完全按照要求执行,永远不会从替代实施策略中受益。