gpt4 book ai didi

java - 如何使用 Java 8 流查找较大值之前的所有值?

转载 作者:IT老高 更新时间:2023-10-28 21:05:49 26 4
gpt4 key购买 nike

用例

通过在工作中发布的一些编码 Katas,我偶然发现了这个我不知道如何解决的问题。

Using Java 8 Streams, given a list of positive integers, produce a list of integers where the integer preceded a larger value.

[10, 1, 15, 30, 2, 6]

The above input would yield:

[1, 15, 2]

since 1 precedes 15, 15 precedes 30, and 2 precedes 6.

非流式解决方案

public List<Integer> findSmallPrecedingValues(final List<Integer> values) {

List<Integer> result = new ArrayList<Integer>();
for (int i = 0; i < values.size(); i++) {
Integer next = (i + 1 < values.size() ? values.get(i + 1) : -1);
Integer current = values.get(i);
if (current < next) {
result.push(current);
}
}
return result;
}

我的尝试

我的问题是我不知道如何在 lambda 中访问 next。

return values.stream().filter(v -> v < next).collect(Collectors.toList());

问题

  • 是否可以检索流中的下一个值?
  • 我应该使用 map 并映射到 Pair 以便访问下一个吗?

最佳答案

使用 IntStream.range :

static List<Integer> findSmallPrecedingValues(List<Integer> values) {
return IntStream.range(0, values.size() - 1)
.filter(i -> values.get(i) < values.get(i + 1))
.mapToObj(values::get)
.collect(Collectors.toList());
}

它肯定比带有大循环的命令式解决方案更好,但就以惯用方式“使用流”的目标而言,仍然有点笨拙。

Is it possible to retrieve the next value in a stream?

不,不是真的。我所知道的最好的引用是在 java.util.stream package description :

The elements of a stream are only visited once during the life of a stream. Like an Iterator, a new stream must be generated to revisit the same elements of the source.

(检索除当前正在操作的元素之外的元素意味着它们可以被多次访问。)

我们还可以通过其他几种方式在技术上做到这一点:

  • 有条不紊(非常好)。
  • 使用流的 iterator 技术上仍在使用流。

关于java - 如何使用 Java 8 流查找较大值之前的所有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com