将一个列表的所有 elements/object 复制 N 次到新列表。使用 java 8 流
Copy All the elements/object of one list N times to new list. Using java 8 stream
将一个列表的所有元素复制N次到一个新列表中。
我有 Fruits 列表,我想迭代 N 次并将所有值添加到新列表,但列表中的值少于我的迭代,所以我想添加具有增量 ID 的 Empty fruits。如何使用 java 8 和流编程。
我当前列表中共有 7 个水果,但我想循环 10 次将所有数据复制到新列表,如果索引中没有数据,那么我想添加具有增量 ID 的空对象。
我试过了,但没有得到预期的结果。
@Data
@AllArgsConstructor
public class Fruit {
int id;
String type;
}
List<Fruit> fruits = new ArrayList<>();
fruits.add(new Fruit(1, "mango"));
fruits.add(new Fruit(2, "grapes"));
fruits.add(new Fruit(3, "apple"));
fruits.add(new Fruit(4, "banana"));
fruits.add(new Fruit(5, "papaya"));
fruits.add(new Fruit(6, "jack fruit"));
fruits.add(new Fruit(7, "dragon fruit"));
List<Fruit> newFruits = new ArrayList<>();
fruits.stream().map(value -> {
IntStream.rangeClosed(1, 10).forEach(index -> {
if (value.equals(null))
newFruits.add(new Fruit(index, ""));
else
newFruits.add(value);
});
return null;
});
预期 OP:对于 newFruits
newFruits :
[Fruit(id=1, type=mango),
Fruit(id=2, type=grapes),
Fruit(id=3, type=apple),
Fruit(id=4, type=banana),
Fruit(id=5, type=papaya),
Fruit(id=6, type=jack fruit),
Fruit(id=7, type=dragon fruit),
Fruit(id=8, type="").
Fruit(id=9, type=")
Fruit(id=10, type="")]
Streams 可能不是完成此任务的正确工具。为什么不直接将原始列表中的所有元素添加到新列表中,并在找到最大 id 后计算要添加多少个新条目?类似于:
List<Fruit> newFruits = new ArrayList<>();
newFruits.addAll(fruits);
int N = 10;
int toAdd = N - fruits.size();
int maxId = fruits.stream().mapToInt(Fruit::getId).max().orElse(0);
IntStream.rangeClosed(1,toAdd).forEach(i -> newFruits.add(new Fruit(maxId + i, "")));
或者看看@Holger 的评论。
将一个列表的所有元素复制N次到一个新列表中。
我有 Fruits 列表,我想迭代 N 次并将所有值添加到新列表,但列表中的值少于我的迭代,所以我想添加具有增量 ID 的 Empty fruits。如何使用 java 8 和流编程。 我当前列表中共有 7 个水果,但我想循环 10 次将所有数据复制到新列表,如果索引中没有数据,那么我想添加具有增量 ID 的空对象。 我试过了,但没有得到预期的结果。
@Data
@AllArgsConstructor
public class Fruit {
int id;
String type;
}
List<Fruit> fruits = new ArrayList<>();
fruits.add(new Fruit(1, "mango"));
fruits.add(new Fruit(2, "grapes"));
fruits.add(new Fruit(3, "apple"));
fruits.add(new Fruit(4, "banana"));
fruits.add(new Fruit(5, "papaya"));
fruits.add(new Fruit(6, "jack fruit"));
fruits.add(new Fruit(7, "dragon fruit"));
List<Fruit> newFruits = new ArrayList<>();
fruits.stream().map(value -> {
IntStream.rangeClosed(1, 10).forEach(index -> {
if (value.equals(null))
newFruits.add(new Fruit(index, ""));
else
newFruits.add(value);
});
return null;
});
预期 OP:对于 newFruits
newFruits :
[Fruit(id=1, type=mango),
Fruit(id=2, type=grapes),
Fruit(id=3, type=apple),
Fruit(id=4, type=banana),
Fruit(id=5, type=papaya),
Fruit(id=6, type=jack fruit),
Fruit(id=7, type=dragon fruit),
Fruit(id=8, type="").
Fruit(id=9, type=")
Fruit(id=10, type="")]
Streams 可能不是完成此任务的正确工具。为什么不直接将原始列表中的所有元素添加到新列表中,并在找到最大 id 后计算要添加多少个新条目?类似于:
List<Fruit> newFruits = new ArrayList<>();
newFruits.addAll(fruits);
int N = 10;
int toAdd = N - fruits.size();
int maxId = fruits.stream().mapToInt(Fruit::getId).max().orElse(0);
IntStream.rangeClosed(1,toAdd).forEach(i -> newFruits.add(new Fruit(maxId + i, "")));
或者看看@Holger 的评论。