当前位置: 首页 > 知识库问答 >
问题:

在Java中折叠顺序流

孙洋
2023-03-14

我习惯了用Scala编程,但我必须编写一些Java,我正在尝试执行相当于以下Scala片段的操作:

trait Options[K, V] {
  def add(key: K , value: V): Options[K, V]
}

val options: Options[T, U] = ???
val elems: List[(T, U)] = ???
elems.foldLeft(options) {
  case (opts, (key, value)) => opts.add(key, value)
}

也就是说,我在选项中折叠元素,在每个步骤中生成一个新实例。

我试着使用Java的流reduce:

interface Options<K, V> {
  Options<K, V> add(K key, V value);
}

Options<K, V> options = ???
Stream<Tuple2<K, V>> elems = ??? // This is Reactor's Tuple2
elems.reduce(options, (opts, opt) -> opts.add(opt), ???)

我不知道合并器应该是什么,我很难想象它的参数会有什么价值。我的理解是,组合器将用于组合并行流中并行生成的中间值。在我的例子中,我根本不关心并行处理元素。换句话说,我正在寻找一个同步和顺序版本的Flux#reduce

我无法控制选项的API<代码>元素不需要是流。


共有1个答案

耿炎彬
2023-03-14

使用您提供的接口编写组合器是不可能的。问题是组合器需要一种方法来组合两个Options,但没有办法做到这一点。任何人都可以使用Options实例做的唯一事情是向其添加一对。我无法从中获取任何信息。它大概不能做任何非常有用的事情。

这个问题可能源于这样一个事实:Java没有trait,Java接口也不是trait的合适替代品。

编写这篇文章的惯用Java方法只是循环的bog标准:

Options<String, String> options = /*whatever*/;
List<Pair<String, String>> elems = /*whatever*/;
for (Pair<String, String> pair : elems)
{
    options = options.add(pair.getKey(), pair.getValue());
}

如果您能够处理这样一个事实,即您永远无法使用并行流,那么您可以利用这样一个事实,即顺序流实际上永远不会使用组合器。因此,您可以编写一个收集器,该收集器定义一个只会引发异常的组合器。

Options<String, String> foo = elems.stream()
    .collect(
        () -> options,
        (opt, pair) -> opt.add(pair.getKey(), pair.getValue()),
        (a, b) -> { throw new UnsupportedOperationException(); }
    );

如果确实要使用reduce,则需要修改界面,以公开有关其包含的键值对的一些信息,或提供一种方法,一次添加多个键值对。例如:

interface Options<K, V>
{
    Options<K, V> add(K key, V value);
    Options<K, V> add(Options<K, V> otherOptions);
}

Options<String, String> options = /*whatever*/;
List<Pair<String, String>> elems = /*whatever*/;

Options<String, String> foo = elems.stream()
    .reduce(
        options,
        (opt, pair) -> opt.add(pair.getKey(), pair.getValue()),
        Options::add
    );

我怀疑这是你想听到的,但是Scala和Java是不同的语言。你不应该期望所有的东西都有完全的相似之处。如果是这样,这两种语言就没有理由存在。

 类似资料:
  • Collapsibles 是可折叠元素,扩大时,点击。他们允许您隐藏不立即与用户相关的内容。 气孔 创建一个气孔式可折叠组件,只要增加类 popout。 <ul class="collapsible popout" data-collapsible="accordion"> 可折叠组件的 HTML 结构 <ul class="collapsible" data-collapsible="accor

  • 如果你仅仅希望看到你所处理的代码文件的结构概览,折叠会是个非常有用的工具。折叠可以隐藏像函数和循环这样的代码块,来简化你屏幕上显示的东西。 当你把鼠标移到数字栏上,你就可以点击显示的箭头来折叠代码段。你也可以使用快捷键alt-cmd-[和alt-cmd-]来折叠和展开代码段。 使用alt-cmd-shift-{来折叠所有代码段,使用alt-cmd-shift-}来展开所有代码段。你也可以使用cmd

  • zf数字 创建折叠,数字参数为折叠行数 zo 打开折叠 zc 关闭折叠 zd 删除折叠 :set foldcolumn=4 显示折叠树 :mkview 保存折叠 :loadview 读取折叠 zr 打开同一层级所有折叠 zm 关闭同一层级所有折叠 zO 打开某一行的所有层级折叠 zC 关闭某一行的所有层级折叠 zR 打开所有折叠 zM 关闭所有折叠 :set foldclose=all 光标离开折

  • 主要内容:实例,实例,用法,选项,方法,实例,事件,实例折叠(Collapse)插件可以很容易地让页面区域折叠起来。无论您用它来创建折叠导航还是内容面板,它都允许很多内容选项。 如果您想要单独引用该插件的功能,那么您需要引用 collapse.js。同时,也需要在您的 Bootstrap 版本中引用 Transition(过渡)插件。或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstr

  • 主要内容:实例,实例,实例,实例Bootstrap4 折叠可以很容易的实现内容的显示与隐藏。 实例 <button data-toggle="collapse" data-target="#demo">折叠</button> <div id="demo" class="collapse"> Lorem ipsum dolor text.... </div> 实例解析 .collapse 类用于指定一个折叠元素 (实例中的 <di

  • Bootstrap折叠板插件允许你在网页中用一点点JavaScript以及CSS类切换内容。它是一个灵活的插件,使用少量的类(来自必需的过渡插件),以方便切换行为。 示例 点击下面的按钮,利用类的改变,显示或隐藏另一个元素: .collapse 隐藏内容 .collapsing 在过渡过程中应用到 .collapse.in 显示内容 你可以使用带href属性的链接,或者使用带data-target