Ich erstelle ein Demonstrationsbeispiel für die Verkettung CompleteableFuture
Operationen und ich denke, ich bin in der Nähe, aber es gibt etwas, das ich vermisse. Alles kompiliert mit Ausnahme des letzten „Build Kuchen parallel“ -Klausel in main()
:Java 8 thenApply() und thenAccept()
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.stream.*;
import java.time.*;
// Use decorator pattern to build up the cake:
interface Cake_ {
String describe();
}
class Cake implements Cake_ {
private int id;
public Cake(int id) { this.id = id; }
@Override
public String describe() {
return "Cake " + id;
}
}
abstract class Decorator implements Cake_ {
protected Cake_ cake;
public Decorator(Cake_ cake) {
this.cake = cake;
}
@Override
public String describe() {
return cake.describe();
}
@Override
public String toString() {
return describe();
}
}
class Frosted extends Decorator {
public Frosted(Cake_ cake) {
super(cake);
}
@Override
public String describe() {
return cake.describe() + " Frosted";
}
}
class Decorated extends Decorator {
public Decorated(Cake_ cake) {
super(cake);
}
@Override
public String describe() {
return cake.describe() + " Decorated";
}
}
// For the cake-building assembly line:
class CreateCakes implements Supplier<Cake> {
private int id;
public CreateCakes(int id) {
this.id = id;
}
@Override
public Cake get() {
return new Cake(id);
}
}
class FrostCakes implements Function<Cake, Frosted> {
@Override
public Frosted apply(Cake cake) {
return new Frosted(cake);
}
}
class DecorateCakes implements Consumer<Frosted> {
public Decorated result;
@Override
public void accept(Frosted fc) {
result = new Decorated(fc);
}
}
public class Test {
public static int NUM_OF_CAKES = 20;
public static void main(String[] args) {
// Change from the default number of threads:
System.setProperty(
"java.util.concurrent.ForkJoinPool" +
".common.parallelism", "" + NUM_OF_CAKES);
// Test/demonstrate the decorator pattern:
List<Cake_> decorated =
IntStream.range(0, NUM_OF_CAKES)
.mapToObj(Cake::new)
.map(Frosted::new)
.map(Decorated::new)
.collect(Collectors.toList());
decorated.forEach(System.out::println);
// Build cakes in parallel:
List<CompletableFuture<?>> futures =
IntStream.range(0, NUM_OF_CAKES)
.mapToObj(id -> new CreateCakes(id))
.map(CompletableFuture::supplyAsync)
.thenApply(new FrostCakes())
.thenAccept(new DecorateCakes())
.collect(Collectors.toList());
futures.forEach(CompletableFuture::join);
}
}
Ich weiß, ich bin einige grundlegende Verständnis in der Definition der futures
Liste fehlt, aber ich habe es aufgenommen zu zeigen, was ich bin versuchen hier zu erreichen: eine Kuchenfabrik mit Teilen des Kuchen-Erstellungsprozesses läuft parallel.
Wenn Sie nach einem Kompilierungsfehler fragen, geben Sie den Kompilierungsfehler ein. –
Sie rufen thenApply() in einem Stream auf. Stream hat keine thenApply() -Methode. –