使用Java 8将Streams聚合到一个DISTINCT的最佳方法是什么?

时间:2016-05-15 08:31:12

标签: java java-8 java-stream

假设我有多个java 8流,每个流可能会转换为Set<AppStory>,现在我希望以最佳性能将所有流聚合成一个DISTINCT流,按ID排序(&#34; LASTUPDATE&#34)

有几种方法可以做但我想要最快的方法,例如:

Set<AppStory> appStr1 =StreamSupport.stream(splititerato1, true).
map(storyId1 -> vertexToStory1(storyId1).collect(toSet());

Set<AppStory> appStr2 =StreamSupport.stream(splititerato2, true).
map(storyId2 -> vertexToStory2(storyId1).collect(toSet());

Set<AppStory> appStr3 =StreamSupport.stream(splititerato3, true).
map(storyId3 -> vertexToStory3(storyId3).collect(toSet());


Set<AppStory> set = new HashSet<>();
set.addAll(appStr1)
set.addAll(appStr2)
set.addAll(appStr3) , and than make sort by "lastUpdate"..

//POJO Object:
public class AppStory implements Comparable<AppStory> {
private String storyId;
private String ........... many other attributes......
public String getStoryId() {
    return storyId;
}
@Override
public int compareTo(AppStory o) {
    return this.getStoryId().compareTo(o.getStoryId());
   }
}

......但这是旧的方式。

如何通过具有最佳效果的ID排序流创建一个DISTINCT

有些想法:

  Set<AppStory> finalSet = distinctStream.sort((v1, v2) -> Integer.compare('not my issue').collect(toSet())

任何想法?

BR

维塔利彼得

2 个答案:

答案 0 :(得分:1)

我不能保证这会比你的速度快(我想是这样,但你必须要测量才能确定),但你可以简单地做到这一点,假设你有3个流:

List<AppStory> distinctSortedAppStories = 
    Stream.of(stream1, stream2, stream3)
          .flatMap(Function.identity())
          .map(this::vertexToStory)
          .distinct()
          .sorted(Comparator.comparing(AppStory::getLastUpdate))
          .collect(Collectors.toList());

答案 1 :(得分:1)

我认为并行开销远远大于您在评论中所述的实际工作量。所以让你的Stream按顺序完成工作。

仅供参考:您应该更喜欢使用Stream::concat,因为Stream::limit可以绕过像Stream::flatMap这样的切片操作。

Stream::sorted正在将Stream中的每个元素收集到List中,对List进行排序,然后按行所需的顺序推送元素。然后再次收集元素。因此,可以通过将元素收集到List中并在之后进行排序来避免这种情况。使用List是比使用Set更好的选择,因为订单很重要(我知道有LinkedHashSet,但您无法对其进行排序。)

在我看来,这是最清洁,也许是最快的解决方案,因为我们无法证明这一点。

Stream<AppStory> appStr1 =StreamSupport.stream(splititerato1, false)
                                       .map(this::vertexToStory1);
Stream<AppStory> appStr2 =StreamSupport.stream(splititerato2, false)
                                       .map(this::vertexToStory2);
Stream<AppStory> appStr3 =StreamSupport.stream(splititerato3, false)
                                       .map(this::vertexToStory3);

List<AppStory> stories = Stream.concat(Stream.concat(appStr1, appStr2), appStr3)
                               .distinct().collect(Collectors.toList());
// assuming AppStory::getLastUpdateTime is of type `long`
stories.sort(Comparator.comparingLong(AppStory::getLastUpdateTime));