I am attempting to simplify my code but list stream is not working. I am creating an instance of a class (that contains an inner class) in a static method and trying to take items from the first list and instantiate them in the inner class and add them to a new list. My code works with fruit loops if that matters, I just want to get rid of excess loops. Below is a copy of what I tried.
instance.firstArrayList.stream() .map(item -> instance.new Innerclass(item)) .collect(Collectors.toCollection(() -> instance.secondArrayList));
I am trying to do this multiple times (at least two so far) so simply setting a new ArrayList instance to this won’t work for me. I know I can simply do this with a single loop but I am trying to learn how to use list streams as it has other methods that I find particularly useful and this is the first problem I have run into so far, and I cannot find examples online on this.
Apologies in advance for my poor formatting, this is my first post.
edit(Solved): in the constructor for outerclass, I redeclared the type ArrayList for secondArrayList and that is why it was not working.
Advertisement
Answer
To add all results of your stream to your secondArrayList
you could just
instance.secondArrayList.addAll(instance.firstArrayList.stream() .map(item -> instance.new Innerclass(item)) .toList());
Or alternatively, without intermediate list, adding elements one by one
instance.firstArrayList.stream() .map(item -> instance.new Innerclass(item)) .forEachOrdered(instance.secondArrayList::add);
Full example (demonstrating both versions):
import java.util.ArrayList; import java.util.List; public class Main { List<String> firstArrayList = new ArrayList<>(); List<Innerclass> secondArrayList = new ArrayList<>(); class Innerclass { private final String s; Innerclass(String s) { this.s = s; } @Override public String toString() { return "I: " + s; } } public static void main(String[] args) { Main instance = new Main(); instance.firstArrayList.addAll(List.of("One", "Two", "Three")); instance.secondArrayList.addAll(instance.firstArrayList.stream() .map(item -> instance.new Innerclass(item)) .toList()); instance.firstArrayList.stream() .map(item -> instance.new Innerclass(item)) .forEachOrdered(instance.secondArrayList::add); instance.secondArrayList.forEach(System.out::println); } }
Output:
I: One I: Two I: Three I: One I: Two I: Three