如何使用流修改列表中的元素并忽略最后一个元素?
How to modify elements inside List using stream and ignore last element?
我有以下列表:
var list = Arrays.asList("a", "b", "c");
我想实现这样的目标:
// "a, "
// "b, "
// "c"
所以我这样做了:
var formattedList = list.stream()
.map(el -> el + ", ")
.collect(Collectors.toList());
它几乎可以正常工作:
// "a, "
// "b, "
// "c, "
但是如您所见,我不知道如何“忽略”流中的最后一个元素。
有人可以帮我实现吗?
您可以使用 .limit()
来限制流式传输的原始列表的元素:
Stream.concat(
list.stream().map(el -> el + ", ").limit(list.size() - 1),
Stream.of(list.get(list.size() - 1)))
.collect(Collectors.toList());
您可以使用String.join()
var list = Arrays.asList("a", "b", "c");
String.join(",", list) // returns a,b,c
我以为你想加入元素。但如果你不这样做,我认为 stream api 不适合这个。传统的迭代器会工作得更好。因为您的要求基于元素的索引。在流中,不提供索引信息。
如果你有一个列表,塔哈斯的回答很好,但如果你有一个流,你可以直接做。
String result = list.stream()
.collect(Collectors.joining(","));
可以用 IntStream
来完成。
var list = Arrays.asList("a", "b", "c");
var formattedList = IntStream.range(0, list.size())
.mapToObj(i -> i != list.size() - 1 ? list.get(i) + ", " : list.get(i))
.collect(Collectors.toList());
但是,如果您确实需要字符串而不是对象列表,当然按照建议使用 String#join
会更合理。
我有以下列表:
var list = Arrays.asList("a", "b", "c");
我想实现这样的目标:
// "a, "
// "b, "
// "c"
所以我这样做了:
var formattedList = list.stream()
.map(el -> el + ", ")
.collect(Collectors.toList());
它几乎可以正常工作:
// "a, "
// "b, "
// "c, "
但是如您所见,我不知道如何“忽略”流中的最后一个元素。
有人可以帮我实现吗?
您可以使用 .limit()
来限制流式传输的原始列表的元素:
Stream.concat(
list.stream().map(el -> el + ", ").limit(list.size() - 1),
Stream.of(list.get(list.size() - 1)))
.collect(Collectors.toList());
您可以使用String.join()
var list = Arrays.asList("a", "b", "c");
String.join(",", list) // returns a,b,c
我以为你想加入元素。但如果你不这样做,我认为 stream api 不适合这个。传统的迭代器会工作得更好。因为您的要求基于元素的索引。在流中,不提供索引信息。
如果你有一个列表,塔哈斯的回答很好,但如果你有一个流,你可以直接做。
String result = list.stream()
.collect(Collectors.joining(","));
可以用 IntStream
来完成。
var list = Arrays.asList("a", "b", "c");
var formattedList = IntStream.range(0, list.size())
.mapToObj(i -> i != list.size() - 1 ? list.get(i) + ", " : list.get(i))
.collect(Collectors.toList());
但是,如果您确实需要字符串而不是对象列表,当然按照建议使用 String#join
会更合理。