如何通过在lambda函数内部收集IntStream来对值进行操作

假设我有一个IntStream,而我想得到例如某个集合things中索引在该流中的项目的列表。

我认为这将很简单

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

,但出现类型不兼容(<lambda parameter>与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方法中实现类似的行为,或者如果我尝试的方法完全不是一个好主意–为什么?什么是一个好的替代方法?

fanqi789 回答:如何通过在lambda函数内部收集IntStream来对值进行操作

  

1)我想得到例如来自某些集合事物的项目列表,这些事物的索引在该流中

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

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

2)这使我感到惊讶,因为如果将boxed()添加到流中,则类似于toMap的方法似乎可以正常工作

对于第二个问题,boxed()将创建Stream的{​​{1}}(如Integer),前提是Stream<Integer>具有collect来收集结果使用Collectors.toMap进入Stream。这是article,具有更多信息

Map

收藏家

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

这让我感到惊讶,因为类似的方法toMap似乎可以正常工作

您可以像这样通过使用mapToObj用地图的相同方式制作地图

List<Thing> collect = IntStream.range(0,10)
        .mapToObj(_i -> things[_i])
        .collect(Collectors.toList());
本文链接:https://www.f2er.com/3128413.html

大家都在问