http://gee.cs.oswego.edu/dl/jsr166/dist/extra166ydocs/
No se rinda tan rápido, ágil!))
From the javadocs (con cambios para mapear a su f) la cuestión esencial es en realidad sólo esto:
ParallelLongArray a = ... // you provide
a.replaceWithMapping (new LongOp() { public long op(long a){return a*2L;}};);
es más o menos esto, ¿verdad?
val list = aLargeList
list.par.map(_*2)
& Si usted está dispuesto a vivir con un poco menos concisión, lo anterior puede ser una razonablemente limpia y clara 3 forro (y, por supuesto, si vuelve a utilizar las funciones, entonces es exactamente lo mismo como Scala - funciones en línea):.
ParallelLongArray a = ... // you provide
LongOp f = new LongOp() { public long op(long a){return a*2L;}};
a.replaceWithMapping (f);
[editado por encima de mostrar la forma completa concisa ala variante Scala de OP]
y aquí está en forma prolija máxima donde empezamos desde cero para la demostración:
import java.util.Random;
import jsr166y.ForkJoinPool;
import extra166y.Ops.LongGenerator;
import extra166y.Ops.LongOp;
import extra166y.ParallelLongArray;
public class ListParUnaryFunc {
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
// create a parallel long array
// with random long values
ParallelLongArray a = ParallelLongArray.create(n-1, new ForkJoinPool());
a.replaceWithGeneratedValue(generator);
// use it: apply unaryLongFuncOp in parallel
// to all values in array
a.replaceWithMapping(unaryLongFuncOp);
// examine it
for(Long v : a.asList()){
System.out.format("%d\n", v);
}
}
static final Random rand = new Random(System.nanoTime());
static LongGenerator generator = new LongGenerator() {
@Override final
public long op() { return rand.nextLong(); }
};
static LongOp unaryLongFuncOp = new LongOp() {
@Override final public long op(long a) { return a * 2L; }
};
}
final Edit y notas:
También tenga en cuenta que una clase simple como la siguiente (que se puede reutilizar a través de sus proyectos):
/**
* The very basic form w/ TODOs on checks, concurrency issues, init, etc.
*/
final public static class ParArray {
private ParallelLongArray parr;
private final long[] arr;
public ParArray (long[] arr){
this.arr = arr;
}
public final ParArray par() {
if(parr == null)
parr = ParallelLongArray.createFromCopy(arr, new ForkJoinPool()) ;
return this;
}
public final ParallelLongArray map(LongOp op) {
return parr.replaceWithMapping(op);
}
public final long[] values() { return parr.getArray(); }
}
y algo así como que le permitirá escribir código Java sea más fluida (si concisión importa a usted):
long[] arr = ... // you provide
LongOp f = ... // you provide
ParArray list = new ParArray(arr);
list.par().map(f);
Y el enfoque anterior sin duda puede ser empujado para que sea aún más limpio.
Desafortunadamente, Java = Scala –
De acuerdo con la ecuación. Es cierto que Java es un * lenguaje * sensato))) Por ejemplo, de la pregunta de snappy a la respuesta a continuación en menos de unos pocos minutos leyendo el código fuente jsr (y la primera vez que mira este jsr). Java es * eminentemente legible *, y gracias a Dios por eso. – alphazero
También hay [esta biblioteca] (http://www.scala-lang.org/api/current/index.html) para la JVM. ;) –