How to modify elements inside List using stream and ignore last element?

Viewed 105

I have the following list:

var list = Arrays.asList("a", "b", "c");

I want to achieve something like that:

// "a, "
// "b, "
// "c"

So I did that:

var formattedList = list.stream()
        .map(el -> el + ", ")
        .collect(Collectors.toList());

It is working almost fine:

// "a, "
// "b, "
// "c, "

but as you can see I don't know how to "ommit" last element in my stream.

Could someone help me achieve that?

4 Answers

Tahas answer is great if you have a list, but if you for some use case have a stream you can just just do.

String result = list.stream()
    .collect(Collectors.joining(","));

You could use .limit() to limit the elements of the original list that are streamed:

        Stream.concat(
                list.stream().map(el -> el + ", ").limit(list.size() - 1),
                Stream.of(list.get(list.size() - 1)))
            .collect(Collectors.toList());

You can use String.join()

var list = Arrays.asList("a", "b", "c");
String.join(",", list) // returns a,b,c

I assumed you wanted to join the elements. But if you don't, I think stream api is not suitable for this. Traditional iterator would work better. Because your requirement is based on index of the element. In streams, index information is not provided.

Could be done with an 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());

However, if you do need a string and not a list of objects, of course it would be more rational to use String#join as suggested.

Related