Ich versuche, eine Methode zu schreiben, die die Indizes eines Objekts in einer Liste von Listen findet und die Parallelität nutzt. Hier ist mein Code.Streams verwenden, um ein Objekt in einer Liste von Listen zu finden
// returns [i, j] where lists.get(i).get(j) equals o, or null if o is not present.
public static int[] indices(List<? extends List<?>> lists, Object o) {
return IntStream.range(0, lists.size())
.boxed()
.flatMap(i -> IntStream.range(0, lists.get(i).size()).mapToObj(j -> new int[]{i, j}))
.parallel()
.filter(a -> {
System.out.println(Arrays.toString(a)); // For testing only
return Objects.equals(o, lists.get(a[0]).get(a[1]));
})
.findAny()
.orElse(null);
}
Wenn ich den folgenden Code ausführen
List<List<String>> lists = Arrays.asList(
Arrays.asList("A", "B", "C"),
Arrays.asList("D", "E", "F", "G"),
Arrays.asList("H", "I"),
Collections.nCopies(5, "J")
);
System.out.println("Indices are " + Arrays.toString(indices(lists, "J")));
der Ausgang ist so etwas wie
[0, 0]
[0, 1]
[0, 2]
[3, 0]
[3, 1]
[3, 2]
[3, 3]
[2, 0]
[3, 4]
[1, 0]
[1, 1]
[2, 1]
[1, 2]
[1, 3]
Indices are [3, 0]
Mit anderen Worten, die Suche wird fortgesetzt, auch nachdem das Objekt gefunden wurde. Ist nicht findAny
soll ein Kurzschlussbetrieb sein? Was vermisse ich? Wie kann man die Parallelität am besten ausnutzen, wenn man über eine Liste von Listen oder ein gezacktes Array iteriert?
EDIT
Im Anschluss an die Vorstellung in @ Sotirios Antwort bekam ich eine Ausgabe von
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 0]
Thread[main,5,main] [2, 0]
Thread[main,5,main] [2, 1]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 0]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 1]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 2]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 3]
Thread[main,5,main] [0, 0]
Thread[main,5,main] [0, 1]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 1]
Thread[main,5,main] [0, 2]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 2]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 3]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 4]
Indices are [3, 0]
Beachten Sie, dass
Thread[ForkJoinPool.commonPool-worker-3,5,main]
weiterhin die Suche auch nach der Antwort gefunden wird.
Verwenden Sie stattdessen findFirst(). –
@TaharBakir Es setzt die Suche fort. –
Außerdem kann Parallelität einige Zeit dauern, bevor ein Thread die anderen benachrichtigen kann, dass sie nicht weitermachen müssen. –