mxscho
mxscho

Reputation: 2170

Append object to list and return result in Java 8?

Is there a way of appending an object to a list and returning the result in one line in a functional non-imperative way? How would you do it if also the original list should not be mutated? Java 8 is allowed.

I already know how to concat two lists in one line. (Source)

List listAB = Stream.concat(listA.stream(), listB.stream()).collect(Collectors.toList());

I also know how to make a list out of objects in one line.

List listO1 = Collections.singletonList(objectA);
List listO2 = Stream.of(objectA, objectB).collect(Collectors.toList());
List listOO = Arrays.asList(objectA, objectB);

Is there anything better than replacing listB in the first line with a part of the following lines?

Upvotes: 13

Views: 23247

Answers (4)

conspicillatus
conspicillatus

Reputation: 335

A bit late to the party, but the situation has not changed since the question was asked. So, what you are looking for is perfectly handled by io.vavr.

import io.vavr.collection.List;

List x0 = List.of();          // []
List x1 = x0.append(o1);      // [o1]
List x2 = x0.prepend(o2);     // [o2]
List x3 = x1.prependAll(x2);  // [o2, o1]

Upvotes: 0

Blair Nangle
Blair Nangle

Reputation: 1541

Alternatively:

List<Foo> updated = Stream.of(originalList, List.of(elementToAdd)).flatMap(Collection::stream).collect(Collectors.toList());

Upvotes: 2

Darshan Mehta
Darshan Mehta

Reputation: 30819

You can use var args and create a stream from it to be appended to the stream of the actual list, e.g:

public static <T> List<T> append(List<T> list, T... args){
    return Stream.concat(list.stream(), Stream.of(args))
            .collect(Collectors.toList());
}

Upvotes: 6

JB Nizet
JB Nizet

Reputation: 691765

You could use

List<Foo> newList = 
    Stream.concat(list.stream(), Stream.of(fooToAdd))
          .collect(Collectors.toList());

Bt I find this a little bit convoluted. Strive for readability rather than finding single-line, more obscure solutions. Also, never use raw types as you're doing in your question.

Upvotes: 22

Related Questions