【问题标题】:Get Index while iterating list with stream [duplicate]使用流迭代列表时获取索引[重复]
【发布时间】:2018-03-03 03:11:11
【问题描述】:
List<Rate> rateList = 
       guestList.stream()
                .map(guest -> buildRate(ageRate, guestRate, guest))
                .collect(Collectors.toList());  

class Rate {
    protected int index;
    protected AgeRate ageRate;
    protected GuestRate guestRate;
    protected int age;
}

在上面的代码中,是否可以在buildRate 方法中传递guestList 的索引。我还需要在构建Rate 时传递索引,但无法使用Stream 获取索引。

【问题讨论】:

  • 你需要折叠(或在 java8 中减少)。 java 8在不提供元组的情况下实现(所谓的)函数式编程非常烦人。

标签: java java-8 java-stream


【解决方案1】:

您尚未提供buildRate 的签名,但我假设您希望首先传入guestList 元素的索引(在ageRate 之前)。您可以使用IntStream 来获取索引,而不必直接处理元素:

List<Rate> rateList = IntStream.range(0, guestList.size())
    .mapToObj(index -> buildRate(index, ageRate, guestRate, guestList.get(index)))
    .collect(Collectors.toList());

【讨论】:

  • Instream. range(0, size). stream() 吗?
  • IntStream 已经是Stream,因此无需重新流式传输它。
  • 您的代码中有一个额外的.stream,请删除它。我会接受你的回答
  • 哦,哎呀!我最初复制了您的代码并忘记删除对stream 的调用。我很抱歉。
  • 要吹毛求疵,IntStream 还不是Stream,但支持几乎相同的操作,只要有int 特定的专业。对于所有其他操作,您可以致电boxed() 真正拥有Stream
【解决方案2】:

如果你的类路径中有 Guava,Streams.mapWithIndex 方法(从 21.0 版开始可用)正是你所需要的:

List<Rate> rateList = Streams.mapWithIndex(
        guestList.stream(),
        (guest, index) -> buildRate(index, ageRate, guestRate, guest))
    .collect(Collectors.toList());

【讨论】:

  • 是的,这也是一个不错的解决方案,谢谢
猜你喜欢
  • 2023-04-04
  • 2018-01-27
  • 2016-12-03
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2015-07-25
相关资源
最近更新 更多