如何使用流修改列表中的元素并忽略最后一个元素?

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 会更合理。