【发布时间】:2016-05-15 08:31:12
【问题描述】:
假设我有多个 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());
}
}
...但这是旧方法。
如何创建一个 DISTINCT 按 ID 排序的流并具有最佳性能
有点像:
Set<AppStory> finalSet = distinctStream.sort((v1, v2) -> Integer.compare('not my issue').collect(toSet())
有什么想法吗?
BR
活力
【问题讨论】:
-
您的
equals方法看起来如何? -
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) 返回 false; AppStory appStory = (AppStory) o; return !(storyId != null ? !storyId.equals(appStory.storyId) : appStory.storyId != null); }
-
我认为类似: Set
dsd = Stream.of(appStr1, appStr2).flatMap(Stream::distinct).sorted((s1, s2) -> Long.compare(s1 .getLastUpdateTime(), s2.getLastUpdateTime())).collect(toSet()); -
每个
Spliterator有多少个元素,vertexToStory方法是否昂贵? -
每个Spliterator大约有1000个元素,vertexToStory方法将DB属性转换为POJO,-不贵
标签: java java-8 java-stream