Java 8 flatmap , stream,collect -


i have situation have

class {     private b b;      public b getb() {         return b;     } } 

and class b

class b {     private list<c> c;      public list<c> getlistc() {         return c;     } } 

now class c contains 2 instance variables

class c {      private int id;      private string name;       public int getid() {           return id;      }       public string getname() {          return name;      } } 

now want achieve below using java 8

list<c> newlistc = a.getb().getlistc(); map<integer, string> map = new hashmap<>();  for(c c : newlistc) {   map.put(c.getid,c.getname()); } 

i have tried many time every time face different problems. code:

    optional<a> a=optional.of(new a());     map<integer, string> map= a.map(a::getb)                             .flatmap(b ->                                     b.getlistc()                                             .stream()                                             .collect(collectors.tomap(                                         c::getid,                                         c::getname                                                     )                                             )                             ); 

error message :

error:(164, 33) java: incompatible types: no instance(s) of type variable(s) u,r,a,capture#1 of ?,t,k,u exist java.util.optional<u> conforms java.util.map<java.lang.integer,java.lang.string> 

thanks in advance

you can’t flatmap optional map; function has return optional. on other hand, since function doesn’t return optional, flatmap unnecessary , ordinary map do:

map<integer, string> map = optional.of(new a())     .map(a::getb)     .map(b -> b.getlistc().stream().collect(collectors.tomap(c::getid, c::getname)))     .orelse(collections.emptymap()); 

but since result of new a() can’t null (and using of instead of ofnullable acknowledges this), indirect processing @ beginning of chain unnecessary:

map<integer, string> map = optional.ofnullable(new a().getb())     .map(b -> b.getlistc().stream().collect(collectors.tomap(c::getid, c::getname)))     .orelse(collections.emptymap()); 

but note nullability of result of getb handled, function passed next mapping step unconditionally invokes stream() on list returned getlistc. returning null list expected bad coding style anyway; can return empty list represent absence of values.

maybe confusion stems stream based alternative solution:

map<integer, string> map = stream.of(new a().getb())     .filter(objects::nonnull)     .flatmap(b -> b.getlistc().stream())     .collect(collectors.tomap(c::getid, c::getname)); 

here, stream consisting of @ 1 element created, followed flatmaping items of list returned getlistc


Comments

Popular posts from this blog

javascript - How to get current YouTube IDs via iMacros? -

c# - Maintaining a program folder in program files out of date? -

emulation - Android map show my location didn't work -