java - 如何在 lambda 函数中对收集 IntStream 的值进行操作

标签 java java-stream

假设我有一个 IntStream我想得到例如一些 Collection 品的 list things其索引在该流中。

我以为会这么简单

IntStream.range(0, 10).collect(Collectors.toList(
    _i -> things[_i]
))

但是出现了类型不兼容的问题(<lambda parameter> vs. int)。 <lambda parameter>不能转换为整数。这让我感到惊讶,因为类似的方法 toMap似乎工作正常,如果我添加 boxed()到流——然后 lambda 参数的类型是 java.lang.Object 而不是 <lambda parameter> :

IntStream.range(0, 10).boxed().collect(Collectors.toMap(
    _i -> things[_i], _i -> 1
))

我正在使用 Java 12。

如何在 toList 中实现类似的行为?方法,或者如果我正在尝试的完全是个坏主意——为什么,以及什么是好的替代方法?

最佳答案

1) I would like to get e.g. a list of items from some collection things whose index is in that stream

对于第一个问题,您必须使用 mapToObj中间操作,从另一个list获取元素使用 index并将它们收集到 List

List<ObjectType> res = IntStream.range(0, 10)
                                .mapToObj(i-> things.get(i))   // or mapToObj(things::get)
                                .collect(Collectors.toList());

2) This surprised me because a similar method toMap seems to work fine, if I add boxed() to the stream

第二个问题boxed()将创建一个 StreamInteger (如 Stream<Integer> ),是 Streamcollect将结果收集到 Map通过使用 Collectors.toMap .这是 article更多信息

<R,A> R collect(Collector<? super T,A,R> collector)

Collection 家

public static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper,
                                                Function<? super T,? extends U> valueMapper)

关于java - 如何在 lambda 函数中对收集 IntStream 的值进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58790828/

相关文章:

java - 创建子类或将类型设置为字符串?

java - 在 Java Web 应用程序 (WAR) 中存储配置文件的最佳位置是什么?

lambda - Java流API : map field without getter syntax

java - Collection.stream() 的实现

java - 给定字符集将 InputStream 转换为 Stream<String>

java - 如何在 Java 中使用笔?

java - 有人可以解释一下吗? (运动无法正常工作)

java - OpenGL - 构造形状的困难

java - 如何流式传输一系列 BigIntegers?

java8 使用累加器和组合器减少流