java - Filter nullable values from stream and updating nullable property -


if have stream<@nullable object>, can filter null-elements that:

stream<@nullable object> s = str.filter(objects::nonnull); 

this, however, returns stream of nullable objects. there elegant way return stream of nonnull elements? @ place know elements can't null.

this i've come with, it's long, imo:

stream<@nonnull object> s = str.map(optional::ofnullable).filter(optional::ispresent).map(optional::get) 

(this implies optional::get return nonnull-values)

well, solutions based on optional or objects assume checker knows semantics of methods, don’t have explicit annotations.

since filter never changes type, require deep support checker model stream<@nullable x>stream<@nonnull x> transition, if understands semantics of filter function.

the simpler approach use map allows changing element type:

stream<@nonnull object> s = str.filter(objects::nonnull).map(objects::requirenonnull); 

here, filter operation ensures there no null elements, doesn’t change formal element type. in contrast, map operation allows changing formal type, , function objects::requirenonnull converts nullable input nonnull output, assuming audit tool knows that, said, these jre provided methods have no annotations.

since requirenonnull throw exception null values, combination of filter , map allows desired behavior of removing null values , changing formal element type.

if audit tool not understand semantic of jre method, you’ll have create equivalent method yourself, annotations,

class myobjutil {     public static <t> @nonnull t requirenonnull(@nullable t obj) {         if(obj==null) throw new nullpointerexception();         return obj;     } } 

which should recognized correct reasonable checker, , use as

stream<@nonnull object> s = str.filter(objects::nonnull).map(myobjutil::requirenonnull); 

your optional based approach can simplified java 9:

stream<@nonnull object> s = str.flatmap(o -> optional.ofnullable(o).stream()); 

which can simplified further:

stream<@nonnull object> s = str.flatmap(o -> stream.ofnullable(o)); 

but of course, again requires tool understanding these methods. or re-implement logic:

class mystreamutil {     public static <t> stream<@nonnull t> ofnullable(@nullable t obj) {         return obj==null? stream.empty(): stream.of(obj);     } } 
stream<@nonnull object> s = str.flatmap(o -> mystreamutil.ofnullable(o)); 

which works under java 8 well.


Comments

Popular posts from this blog

gridview - Yii2 DataPorivider $totalSum for a column -

java - Suppress Jboss version details from HTTP error response -

Sass watch command compiles .scss files before full sftp upload -