ank*_*kpd 4 java-8 java-stream
Java的Stream API中是否有一种方法可以不同于其他方式映射流的第一个元素?
相当于这段代码:
List<Bar> barList = new ArrayList<>();
for (int i=0; i<fooList.size(); i++) {
Foo foo = fooList.get(i);
Foo modifiedFoo = foo.getModifiedFoo();
if (i == 0) {
barList.add(new Bar(modifiedFoo, false));
}else {
barList.add(new Bar(modifiedFoo, true));
}
}
Stream<Bar> = barList.stream();
Run Code Online (Sandbox Code Playgroud)
注意:我已经有了一个流设置,我希望在第一次映射后进行一些操作
fooList.stream()
.map(Foo::getModifiedFoo)
.(May be Some operation here to get different new Bar for first modifiedFoo)
.map(modifiedFoo -> new Bar(modifiedFoo, true));
Run Code Online (Sandbox Code Playgroud)
我会得到第一个元素,创建一个元素Stream并应用所需的映射.然后,我将使用列表的其余部分,从中创建一个流并应用不同的映射.然后concat是溪流.像这样的东西:
Stream<Bar> first = Stream.of(fooList.get(0))
.map(Foo::getModifiedFoo)
.map(modifiedFoo -> new Bar(modifiedFoo, false));
Stream<Bar> others = fooList.subList(1, fooList.size()).stream()
.map(Foo::getModifiedFoo)
.map(modifiedFoo -> new Bar(modifiedFoo, true));
Stream<Bar> bars = Stream.concat(first, others).flatMap(s -> s);
Run Code Online (Sandbox Code Playgroud)
另一种方法:
Stream<Bar> bars = IntStream.range(0, fooList.size())
.mapToObj(i -> new Bar(fooList.get(i).getModifiedFoo(), i > 0));
Run Code Online (Sandbox Code Playgroud)
这种方式很简洁,做得很好.
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |