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
维塔利
我认为并行开销比您在评论中所述的实际工作要大得多。因此,让您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)
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |