当前位置: 首页 > 面试题库 >

单行获取Stream / List的最后一个元素

卫昊东
2023-03-14
问题内容

如何在以下代码中获取流或列表的最后一个元素?

哪里data.careasList<CArea>

CArea first = data.careas.stream()
                  .filter(c -> c.bbox.orientationHorizontal).findFirst().get();

CArea last = data.careas.stream()
                 .filter(c -> c.bbox.orientathtml" target="_blank">ionHorizontal)
                 .collect(Collectors.toList()).; //how to?

如您所见,获得第一个元素一定filter并不困难。

但是,获得单线的最后一个元素确实是一个痛苦:

  • 看来我无法直接从Stream。(仅对有限的流有意义)
  • 这似乎也不能得到像first()last()List接口,这实在是一种痛苦。

我看不到在接口中不提供first()and last()方法的任何参数List,因为其中的元素是有序的,而且大小是已知的。

但是按照原始答案:如何获得有限的最后一个元素Stream

就个人而言,这是我可以获得的最接近的结果:

int lastIndex = data.careas.stream()
        .filter(c -> c.bbox.orientationHorizontal)
        .mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);

但是,它确实涉及indexOf在每个元素上使用on,这通常是您通常不希望的,因为它会影响性能。


问题答案:

可以使用Stream ::
reduce
方法获取最后一个元素。下面的清单包含一般情况的最小示例:

Stream<T> stream = ...; // sequential or parallel stream
Optional<T> last = stream.reduce((first, second) -> second);

此实现适用于所有有序流(包括从List创建的流)。对于无序流,由于显而易见的原因,未指定将返回哪个元素。

该实现适用于 顺序 并行流
。乍一看这可能令人惊讶,但是不幸的是文档没有明确说明。但是,它是流的重要功能,我尝试对其进行澄清:

  • 方法Stream :: reduce的Javadoc 指出,它 不受 顺序 执行的约束”
  • Javadoc还要求 “累加器函数必须是 用于组合两个值的 关联无干扰无状态 函数”,这显然是lambda表达式的情况(first, second) -> second
  • 用于归约运算的Javadoc 指出: “流类具有多种形式的常规归约运算,分别称为 reduce()和collect() [..]”_和 “ 只要函数具有适当的构造,reduce运算就 具有固有的可并行 性。 )用于处理元素是关联的和无状态的。”_

与密切相关的收集器的文档更加明确:
“为确保 顺序并行执行 产生 相等的结果
,收集器功能必须满足标识和关联性约束。”

回到原始问题:以下代码将对最后一个元素的引用存储在变量中last,如果流为空,则引发异常。复杂度在流的长度上是线性的。

CArea last = data.careas
                 .stream()
                 .filter(c -> c.bbox.orientationHorizontal)
                 .reduce((first, second) -> second).get();


 类似资料:
  • 如何在下面的代码中获取流或列表的最后一个元素? 其中是: 正如您所看到的,使用特定的获取第一个元素并不难。 null 我看不出在接口中没有提供和方法的任何理由,因为其中的元素是有序的,而且大小是已知的。 但正如最初的答案:如何获得有限的最后一个元素? 就我个人而言,这是我能得到的最接近的结果:

  • rank ▲ ✰ vote url 61 374 45 700 url 获取列表最后一个元素 在Python里,如何获取一个列表的最后一个元素? some_list[-1]最短最Pythonic的方法. 事实上你可以用这个语法做好多事.some_list[-n]语法获取倒数第n个元素.所以some_list[-1]获取最后一个元素,some_list[-2]获取倒数第二个,等等.最后some_li

  • 问题内容: 我正在使用String split方法,并且我想拥有最后一个元素。数组的大小可以更改。 例: 我想分割上面的字符串并得到最后一个项目: 我不知道在运行时数组的大小:( 问题答案: 将数组保存在局部变量中,并使用数组的字段查找其长度。减去1以说明它是基于0的: 注意:如果原始字符串仅由分隔符组成,例如或,则为0,这将引发ArrayIndexOutOfBoundsException。示例:

  • 问题内容: 我有一个集合,我想获取集合的最后一个元素。最直接,最快捷的方法是什么? 一种解决方案是先toArray(),然后返回数组的最后一个元素。还有其他更好的方法吗? 问题答案: 这不是一个非常有效的解决方案,但是可以工作一个:

  • 问题内容: 在Python中,如何获取列表的最后一个元素? 问题答案: 是最短和最的。 实际上,你可以使用此语法做更多的事情。该语法获取第n到最后一个元素。因此获取最后一个元素,获取倒数第二个,依此类推,一直向下到,这将为你提供第一个元素。 你也可以通过这种方式设置列表元素。例如: 请注意,如果期望的项目不存在,则按索引获取列表项将引发。这意味着如果为空将引发异常,因为空列表不能有最后一个元素。

  • 本文向大家介绍js获取数组的最后一个元素,包括了js获取数组的最后一个元素的使用技巧和注意事项,需要的朋友参考一下 在js里面如何获取一个数组的最后一个元素呢?这里总结了两种方法,有需要的朋友可以看看。 (1)js内置pop方法 pop() 方法用于删除并返回数组的最后一个元素,注意这里在获取了数组的最后一个元素的同时也将原数组的最后一个元素给删除了。如果数组已经为空,则该方法不改变数组,并返回