precomputing some code in a scala closure. -


in scala, have following code:

def isdifferentgroup(artifact2: defaultartifact) = getartifact(artifact1id).getgroupid != artifact2.getgroupid val artifacts = getartifacts().filter(issamegroup) 

the function isdifferentgroup accessing external string variable artifactid (closure).

i'd avoid computing getartifact(artifactid) each item in list.

i follows:

val artifact1: defaultartifact = getartifact(artifact1id) def isdifferentgroup(artifact2: defaultartifact) = artifact1.getgroupid != artifact2.getgroupid val artifacts = getartifacts().filter(issamegroup) 

however, creating variable artifact1 outside fonction isdifferentgroup, , ugly, because variable used inside fonction isdifferentgroup.

how solve it?

one possibility make partial function follows:

def isdifferentgroup(artifact1: defaultartifact)(artifact2: defaultartifact) = artifact1.getgroupid != artifact2.getgroupid val artifacts = getartifacts().filter(isdifferentgroup(getartifact(artifact1id))) 

however, have move code getartifact(artifactid) outside isdifferentgroup function, , don't want this.

how solve it?

everything processed in function body evaluated every time function called, can't tell part of statically evaluated , shared (without resorting using kind of external cache). have separate function body values want evaluate in advance , use inside function.

however, can enclose such values in block forms compact block. best thing can think of declare val function type, such as

val isdifferentgroup: defaultartifact => boolean = {     val gid = getartifact(artifact1id).getgroupid     (artifact2: defaultartifact) => {         (gid != artifact2.getgroupid)     } } 

this way, can explicitly state part evaluated statically once in main val block (here gid) , part evaluated in response artifact2 argument. , can call isdifferentgroup if method:

println(isdifferentgroup(someartifact)) 

this different way of creating encapsulating class like

val isdifferentgroup: defaultartifact => boolean =   new function1[defaultartifact,boolean] {     val gid = getartifact(artifact1id).getgroupid      override def apply(artifact2: defaultartifact): boolean =         (gid != artifact2.getgroupid);   } 

you can declare lazy val, in case gid evalauted at most once, first time function called.


Comments

Popular posts from this blog

java - nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet Hibernate+SpringMVC -

sql - Postgresql tables exists, but getting "relation does not exist" when querying -

asp.net mvc - breakpoint on javascript in CSHTML? -