假设我有多个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
维塔利彼得
答案 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));