只是从字符串列表中重复删除的示例探索。旧方法在执行新lambda / stream方法方面表现优异。新方法背后的设计思想是什么?与性能相比,它还带来了其他好处吗?
List<String> nameList = new ArrayList<>();
Collections.addAll(nameList, "Raj","Nil",.......);
removeDupViaSet(nameList);
removeDupViaStream(nameList);
private static void removeDupViaStream(List<String> nameList) {
long start = System.nanoTime();
List<String> nm = nameList.stream().distinct().collect(Collectors.toList());
long end = System.nanoTime() - start;
System.out.println("Dup Removed via Stream : " + end);
}
private static void removeDupViaSet(List<String> nameList) {
long start = System.nanoTime();
Set<String> tempHashSet = new HashSet<>();
tempHashSet.addAll(nameList);
nameList.clear();
nameList.addAll(tempHashSet);
long end = System.nanoTime() - start;
System.out.println("Dup Removed via Set : " + end);
}
Dup通过套装删除:1186909
Dup通过Stream删除:67513136
答案 0 :(得分:2)
distinct()的合同是:
返回由此流的不同元素(根据Object.equals(Object))组成的流。
因为它只能使用equals
因此无法使用hashcode
,所以您要将苹果与橙子进行比较。任何允许使用hashcode
的算法(例如HashSet
)肯定会胜过distinct
。
答案 1 :(得分:1)
一般来说,使用流时,您不会一直获得性能。这取决于操作和数据大小,例如,与旧式方法相比,大小为10的列表上的并行流将不会有效。如果10k,它开始表现得超出规模。
最佳选择是在评估绩效时考虑操作和数据大小。