Reputation: 2170
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
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
Reputation: 1541
Alternatively:
List<Foo> updated = Stream.of(originalList, List.of(elementToAdd)).flatMap(Collection::stream).collect(Collectors.toList());
Upvotes: 2
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
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