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

Vit*_*lyT 7 java java-8 java-stream

假设我有多个java 8流,每个流可能会被转换成Set<AppStory>,现在我希望具有最佳性能,按ID将所有流聚合成一个DISTINCT流,按属性排序("lastUpdate")

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

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());
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有些想法:

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

有任何想法吗 ?

BR

维塔利

Flo*_*own 1

我认为并行开销比您在评论中所述的实际工作要大得多。因此,让您Stream按顺序完成这项工作。

仅供参考:您应该更喜欢使用,Stream::concat因为诸如切片之类的操作Stream::limit可以被绕过Stream::flatMap

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

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

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));
Run Code Online (Sandbox Code Playgroud)