I would like to write foreach on some array (that may contains null elements in random places) that will print to the console list of not-null elements with numbering
Lets say I have array called personArray that contains some Person objects. The result I expect is something like this
1 Name Lastname
2 Name2 Lastname2
3 Name3 Lastname3
and so on..
I know I can do foreach like this:
Arrays.stream(personArray).filter(n -> n != null).forEach(person -> System.out.print(person.getName() + " " + person.getLastname()));
but this will print not-null objects without ordering number
Name Lastname
Name2 Lastname2
Name3 Lastname3
and so on..
so how to "number" it? since every variable used inside lambda declared outside must be final its impossible to increment it
May not be the best solution, but it's one
AtomicInteger x=new AtomicInteger(1);
Arrays.stream(personArray)
.filter(n -> n != null)
.forEach(person -> System.out.print((x.getAndIncrement())+""+person.getName() + " " + person.getLastName()));
If it's acceptable for you using an AtomicInteger, you could do this, being AtomicInteger an immutable class.
Or withouth using any variable, playing a bit with reduce
Arrays.stream(personArray)
.filter(n -> n != null)
.reduce(1,(a,b)->{System.out.println(a+" "+b.getName() + " " + b.getLastName());return ++a;},(a,b)->{return ++a;});
Notice that inside a lambda expression you're not allowed to modify the object, but you're allowed to modify its state. This is why, in my first example, you can't reassing a new value to x with new keyword, but you can modify its state, i.e. the integer it's wrapping.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With