java - Is there any way to use BiConsumers as simply as Consumers? -
this theorical question no concrete application.
i have following method not touch. (if possible @ all) used biconsumer
.
void dosmallthing(a a, b b) { // , b. } void dobigthing(list<a> as, b b) { // do? }
how can iterate on as
while keeping b
constant , use this::dosmallthing
in dobigthing
?
of course following doesn't work.
void dobigthing(list<a> as, b b) { as.stream() .foreach(this::dosmallthing); }
the following works nice , use everyday.
void dobigthing(list<a> as, b b) { as.stream() .foreach(a -> dosmallthing(a, b)); }
the following works well, bit more tricky.
consumer<a> dosmallthingwithfixedb(b b) { return (a) -> dosmallthing(a, b); } void dobigthing(list<a> as, b b) { as.stream() .foreach(dosmallthingwithfixedb(b)) }
but of solutions don't simplicity of consumer
case. there simple exists biconsumer
?
you want "bind" function argument. unfortunately there's no built-in mechanism in java 8 (except binding object instance methods this::
). may generalize dosmallthingwithfixedb
method this:
public class bind { public static <a, b> consumer<a> bindlast(biconsumer<a, b> fn, b b) { return -> fn.accept(a, b); } public static <a, b> consumer<b> bindfirst(biconsumer<a, b> fn, a) { return b -> fn.accept(a, b); } }
and use:
void dobigthing(list<a> as, b b) { as.stream() .foreach(bind.bindlast(this::dosmallthing, b)); }
probably there's third-party library contains such methods. using explicit lambda seems ok me. should not try express method references.
Comments
Post a Comment