Java 用不同的方法将操作附加到流中是一种不好的做法吗?

Java 用不同的方法将操作附加到流中是一种不好的做法吗?,java,java-8,java-stream,Java,Java 8,Java Stream,假设我的应用程序中有多个类使用的方法。此方法将流作为参数,并应用终端操作forEach,以便将数据写入文件,如下所示: public File writeStreamToTempFile(Stream stream) { stream.forEach(item -> { //some code to write item to a file } } public void exportAnimalsData() { Stream<Animal

假设我的应用程序中有多个类使用的方法。此方法将
作为参数,并应用终端操作
forEach
,以便将数据写入文件,如下所示:

public File writeStreamToTempFile(Stream stream) {
    stream.forEach(item -> {
        //some code to write item to a file
    }
}
public void exportAnimalsData() {
    Stream<Animal> animalStream = //fetch data from a DB
    animals.filter(a -> a.type.equals("dog"))
           .map(a -> //Do something useful to transform the Dogs);

    writeStreamToTempFile(animalStream);
}
此方法有多个调用者,在其中一些方法中,我需要转换数据,比如说使用map函数,如下所示:

public File writeStreamToTempFile(Stream stream) {
    stream.forEach(item -> {
        //some code to write item to a file
    }
}
public void exportAnimalsData() {
    Stream<Animal> animalStream = //fetch data from a DB
    animals.filter(a -> a.type.equals("dog"))
           .map(a -> //Do something useful to transform the Dogs);

    writeStreamToTempFile(animalStream);
}
public void exportAnimalsData(){
Stream animalStream=//从数据库获取数据
animals.filter(a->a.type.equals(“狗”))
.map(a->//做一些有用的事情来改变狗);
writeStreamToTempFile(animalStream);
}
并非所有
writeStreamToTempFile
方法的调用方都需要对流执行额外的操作

所以我的问题是:

用不同的方法对流应用操作是一种不好的做法吗

我在某个地方读到,流不应该是方法的返回类型(调用方不知道该方法是否已经使用流),它是否也适用于方法的参数

我应该在同一个方法中应用所有需要的操作,还是可以在不同的方法中将中间操作附加到同一个流中

我应该只应用相同方法中所需的所有操作,还是 可以将中间操作附加到中的相同流 不同的方法

从技术上讲,它不一定是同一个流/对象。例如,在流上调用诸如
map()
之类的操作将创建另一个流

事实上,我认为虽然您没有使用终端操作来使用流,但我不明白为什么要处理它来创建或获取预期流,然后传递给预期流的方法会是一个问题

我在某个地方读到,流永远不应该是方法的返回类型

不确定您在哪里读到
永远不应该是方法的返回类型。(你能用链接更新你的问题吗?)

相反,流API的设计者之一Brian Goetz显然不这么认为:

(调用方不知道该方法是否已使用该流)

如果调用者正在获得一个
,则隐式地理解该流是可用的。如果返回已使用的
,则类似于返回已关闭的
套接字
或已关闭的
输入流
。虽然在语法上是可能的,但它只是糟糕的编码。这并不意味着你不应该仅仅因为某个坏的编码器偶尔会返回一个处于坏状态的套接字,就从一个方法返回一个
Socket
InputStream

相反,一元样式的对象旨在返回<代码>流,
可选
可完成的未来
,以及所有的功能接口(
功能
消费者
操作员
,等等)都将被返回,这样就可以附加更多的功能性操作,而无需在现场实际执行该功能

你给我举的例子完全合理。您在某种程度上通过对管道的附加操作来装饰
流。您可以使用逻辑来决定将哪些操作添加到管道中,并且没有理由不将它们适当地封装在小方法中


此外,如果流非常大,包含数十万个元素,如果您返回了一个集合,那么您只需在内存中创建一个巨大的集合,从而产生了添加所有元素的成本,然后再次流化它们以将它们写入文件。没有多大意义,是吗?

Stream永远不应该是方法的返回类型听起来像是坏策略,JDK经常违反这种策略。很明显,返回流的方法不会消耗它。在尝试查找视频时,如果我听说不建议从方法返回流,则查找“方法…返回流”将在我找到它后更新问题。顺便说一句,回答得很好,谢谢。我想看看。但这可能是错误的(或与上下文不同)。请放心,返回
(或任何其他函数类型)是完全正确的。只需让你的代码可读并合理组织即可。