我本来要写一篇关于如何将流与每个元素的索引混合的文章,但是Baeldung上的人们已经很好地涵盖了这个主题 ! 鉴于我是他们编辑团队的一员,我为他们/我们感到自豪。
有趣的是,特别是Streams中的Java函数式编程如何使我们脱离了一些常见的模式。 例:
List<Foo> foos = new ArrayList<>();
for (int i=0; i < bars.size(); i++) {foos.add(new Foo(i, bars.get(i));
}
上面的代码从索引创建一个新的Foo ,从源列表创建一个bar 。
当Stream.collect是一个更大的信号,我们要从迭代中提取数据时,我们不喜欢在for循环中间使用add 。 同样,当我们可以在流声明中更明确地表示有效的Stream.map时,我们不希望将其隐藏在循环中。 我们都知道以上内容应读为:
List<Foo> foos = bars.stream().map( ... something ...).collect(toList());
尴尬的挑战是某些事情不容易完成。
如何选择做什么
总体而言,围绕流操作编写复杂的功能清单是一种隐藏流要向我们展示的东西的方法,即,数据如何从一个地方转到另一个地方。
所以这是一些想法:
- 也许只有一个for循环–可能会更容易
- 如果您发现操作主体中的主要参与者是索引,那么请进行一系列索引,并在最后一分钟将对象与List.get混合,假设您的列表已被有效索引
- 如果主要玩家是一个对象,则可以存储一个计数器( AtomicInteger是一个不错的选择)并在最后一刻增加它,注意排序和并行流
- 如果代码变得复杂,请尝试通过提取函数来将流逻辑与业务逻辑分离
- 也许将其委托给一个图书馆-Baeldung的文章展示了ProtonPack和其他可能更好的东西,它们已经过测试和记录。
无论您做什么,都不要从原则上使自己变得困难。
翻译自: https://www.javacodegeeks.com/2019/08/object-index-streams.html