映射流的第一个元素与休息不同

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)

Fed*_*ner 8

我会得到第一个元素,创建一个元素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)

这种方式很简洁,做得很好.