从列表中删除重复项:旧方法与流设计思想?

时间:2018-02-16 09:33:49

标签: java optimization collections functional-programming

只是从字符串列表中重复删除的示例探索。旧方法在执行新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

2 个答案:

答案 0 :(得分:2)

distinct()的合同是:

  

返回由此流的不同元素(根据Object.equals(Object))组成的流。

因为它只能使用equals因此无法使用hashcode,所以您要将苹果与橙子进行比较。任何允许使用hashcode的算法(例如HashSet)肯定会胜过distinct

答案 1 :(得分:1)

一般来说,使用流时,您不会一直获得性能。这取决于操作和数据大小,例如,与旧式方法相比,大小为10的列表上的并行流将不会有效。如果10k,它开始表现得超出规模。

最佳选择是在评估绩效时考虑操作和数据大小。