通过在工作中发布的Katas编码,我偶然发现了这个不确定的问题。
在给定正整数列表的情况下,使用Java 8 Streams会生成整数列表,其中整数在较大值之前。
[10, 1, 15, 30, 2, 6]
上面的输入将产生:
[1, 15, 2]
因为1在15之前,15在30之前,2在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中访问下一步。
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());
}
它肯定比带有大循环的命令式解决方案更好,但就以惯用方式“使用流”的目标而言仍有些不足。
是否可以检索流中的下一个值?
不,不是这样。我所知道的最好的引用是在java.util.stream
包装说明中:
在流的生存期内,流的元素只能访问一次。与一样
Iterator
,必须生成新的流以重新访问源中的相同元素。
(检索正在操作的当前元素之外的元素意味着可以多次访问它们。)
从技术上讲,我们还可以通过其他几种方式来做到这一点:
iterator
是 在技术上 还是使用流。问题内容: 如何找到所有大写字母的列值?喜欢而不是 这是我正在尝试的… 问题答案: 您可以强制区分大小写的排序规则;
我编写了以下方法来查找映射到最高值的键,并尝试转换为java。你能帮忙吗?
任何暗示都会很明显。
我想找出numpy数组中所有值之间的差异,并将其附加到一个新列表中。 也就是说,对于一个的每个值
我有一个hashmap,看起来像这样: 我的ImageRecipeMap对象如下所示: 我想获取所有ImageID列表,并使用Java8流创建一个总的ImageID列表。到目前为止,这就是我所拥有的,但我的collect上似乎有一个编译错误:
我在Java 8 lambdas和streams上测试了函数,似乎在执行的情况下,即使有多个对象与0相比,它也会返回绑定候选项中的任意元素,而无需进一步考虑。 对于这样的最大期望行为,是否有一个明显的技巧或函数,以便返回所有的最大值?我在API中没有看到任何东西,但我确信它一定存在比手动比较更好的东西。 例如: