Java 接口设计:采用单一输入并返回多个输出的方法

Java 接口设计:采用单一输入并返回多个输出的方法,java,Java,我想收集哪些是首选的反馈,是好是坏 Function<I, O> { List<O> take( I ); } 函数{ 名单(I); } 或 接收机{ 无效取数(T); } 处理机{ 无效处理器(I,接收器>); } 我知道简单的答案是函数,但处理器确实有一些好处 能够通过一个接收器过滤添加的内容 没有明确的首选方案。这取决于用例 正如您所指出的,使用前者的主要原因是简单。客户端不必实现任何东西就可以使用您的接口。对于服务API来说,函数并不总是最佳选择,因为

我想收集哪些是首选的反馈,是好是坏

Function<I, O> {
  List<O> take( I );
}
函数{
名单(I);
}

接收机{
无效取数(T);
}
处理机{
无效处理器(I,接收器>);
}
我知道简单的答案是函数,但处理器确实有一些好处

  • 能够通过一个接收器过滤添加的内容

    • 没有明确的首选方案。这取决于用例

      正如您所指出的,使用前者的主要原因是简单。客户端不必实现任何东西就可以使用您的接口。对于服务API来说,函数并不总是最佳选择,因为您可能事先不知道要返回多少操作系统

      采用后者的主要原因是可伸缩性。例如,您可能正在生成数以百万计的O对象,在返回任何对象之前尝试将它们全部填充到内存中是自杀。然而,像处理器这样的回调模式很难嵌入到服务API中

      最佳服务API是一种混合API:

      Function<I, O> {
        List<O> take( I, OToken );
      }
      
      函数{
      列表(I,OToken);
      }
      

      其中返回一个O的“页面”,从表示返回的最后一个页面结尾的OToken开始。顺便说一句,如果您愿意返回
      迭代器而不是
      列表来实现分页和可伸缩性,那么您可以在客户端的上面添加另一层,它可以抽象出OToken内容。您可以轻松地实现逻辑,只取接收器中的前n。无需将其烘焙到处理器中。这些类型的用例是我脑海中可以实现的额外功能。您对迭代器的评论当然是好处的一部分。@mP.,如果分页逻辑在
      接收器中,那么
      处理器将需要
      获取(O)
      的一些反馈,以避免在n+1到百万次输出上浪费周期。它变成了两者之间的对话,如果您的起点超过了索引0,或者如果这是您正在描述的服务API,则会变得更加复杂。我相信您也可以将处理器作为客户端的一个层来处理。@判断为true要处理停止操作,需要返回一个控件,该控件有两个选项:继续和停止。
      Function<I, O> {
        List<O> take( I, OToken );
      }