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
Post a Comment