gpt4 book ai didi

java-8 - 映射流的第一个元素与其余元素不同

转载 作者:行者123 更新时间:2023-12-04 22:40:04 26 4
gpt4 key购买 nike

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();

注意:我已经有一个流设置,我想在第一次映射后进行一些操作
fooList.stream()
.map(Foo::getModifiedFoo)
.(May be Some operation here to get different new Bar for first modifiedFoo)
.map(modifiedFoo -> new Bar(modifiedFoo, true));

最佳答案

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

另一种方法:
Stream<Bar> bars = IntStream.range(0, fooList.size())
.mapToObj(i -> new Bar(fooList.get(i).getModifiedFoo(), i > 0));

这种方式很简洁并且可以很好地完成工作。

关于java-8 - 映射流的第一个元素与其余元素不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49456017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com