如何清理Java Streams?

时间:2018-04-20 19:35:41

标签: java design-patterns java-stream

我有这个流,以及其他一些人,我滥用了一堆电话来完成工作。当利用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);
+            });

如何缩短这一点以及将来我应该注意哪些陷阱以避免这种类型的开发?

2 个答案:

答案 0 :(得分:5)

嗯,您不需要中间data%>% filter(Sick.days > 2) %>% group_by(Gender) %>% summarize(number=n()) %>% ggplot(.,aes(x=Gender,y=number)) + geom_bar(aes(group=Genser),stat="identity", width= 0.4, alpha=0.6,color="blue") + labs(x="Gender",y="number of cases") + coord_flip()+theme_bw() 电话,因为它不必要并且可以避免开销。

.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); }); 的主体提取到方法中以简化管道。

答案 1 :(得分:4)

我叫安迪,我不喜欢溪流。

这段代码就是一个很好的例子。 (好吧,它们有时很有用;但实际上只是在非常简单的情况下)。

您(希望)在编程中尽早学习的一件事是,识别使您的代码可读:它可以帮助您了解相关值的发生位置。

在流式代码中,缩进就在窗外。左手保证金是直的 - 看看所有期间如何排列:

RTRIM

它没有视觉结构。

特别是因为这是使用+ 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

(您可能没有使用Java 10;但我不知道数据类型。如果需要,请填写类型而不是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); } } 。)

就个人而言,我认为方式更容易阅读。而且它更短。