[英]How can I clean up my Java Streams?
我和其他很多人一樣,在這里,我濫用了大量的電話來完成工作。 利用J8時好像是反模式。
+ Arrays.stream(resources)
+ .map(this::ingestFromFile)
+ .collect(Collectors.toList())
+ .stream()
+ .map(Container.class::cast)
+ .map(Container::getAll)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList())
+ .forEach(
+ dataType -> {
+ loaderConstants.getRepo(dataType.toString()).save(dataType);
+ LOGGER.log(Level.INFO, "Saved: " + dataType);
+ });
我如何縮短時間,為避免此類發展,我將來應該注意哪些陷阱?
好吧,您不需要中間的.collect(Collectors.toList())
調用,因為這是不必要的,並且可以避免可避免的開銷。
Arrays.stream(resources)
.map(this::ingestFromFile)
.map(Container.class::cast)
.map(Container::getAll)
.flatMap(Collection::stream)
.forEach(
dataType -> {
loaderConstants.getRepo(dataType.toString()).save(dataType);
LOGGER.log(Level.INFO, "Saved: " + dataType);
});
然后,您可以將forEach
的主體提取為簡化管道的方法。
我叫安迪(Andy),我不喜歡串流。
這段代碼很好地說明了為什么。 (好的,它們有時會有所幫助;但實際上僅在非常簡單的情況下)。
您(很希望)在編程的早期就學到了一件事,即身份使代碼易於閱讀:它可以幫助您了解相關值發生的事情。
在流式代碼中,縮進直接顯示在窗口之外。 左邊距是筆直的-查看所有期間如何排列:
+ Arrays.stream(resources)
+ .map(this::ingestFromFile)
+ .collect(Collectors.toList())
+ .stream()
+ .map(Container.class::cast)
+ .map(Container::getAll)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList())
+ .forEach(
+ dataType -> {
+ loaderConstants.getRepo(dataType.toString()).save(dataType);
+ LOGGER.log(Level.INFO, "Saved: " + dataType);
+ });
只是沒有視覺結構。
尤其是在使用forEach
,使用循環會更容易。
for (var resource : resources) {
var fromFile = resource.ingestFromFile();
var container = (Container) fromFile;
for (var dataType : container.getAll()) {
loaderConstants.getRepo(dataType.toString()).save(dataType);
LOGGER.log(Level.INFO, "Saved: " + dataType);
}
}
(您可能沒有使用Java 10;但是我還是不知道數據類型。如果需要,請填寫類型而不是var
)。
就個人而言,我認為這是比較容易的方式閱讀。 而且更短。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.