2015-09-11 9 views
10

Ich versuche, 100 alle Aufgaben parallel über Testamentsvollstrecker und runnable auszuführen, muss die Aufgabe, die Schleifenvariable verwenden:die nicht endgültige Schleifenvariable in einem Lambda-Ausdruck Mit

for (int i = 0; i < 100; i++) { 
    executor.execute(() -> { 
    doSomething(String.format("Need task number %d done", i)); 
    } 
    }); 
} 

ich eine verschnörkelt unter 'i' sagt - Variable used in lambda expression should be effectively final.

Eine Schleife Variable, soweit ich weiß, kann nicht endgültig oder effektiv endgültig gemacht werden, da es mit jeder Iteration geändert wird. Ich fand eine einfache Abhilfe,

for (int i = 0; i < 100; i++) { 
    int index = i; 
    executor.execute(() -> { 
    doSomething(String.format("Need task number %d done", index)); 
    } 
}); 
} 

Dies ist nicht die effektivste Lösung zu mir scheint, eine neue Variable bei jeder Iteration zu deklarieren. Gibt es einen besseren Weg, dies zu tun?

+0

Dies ist lokaler Variable, so dass ich denke, es ist nicht wirklich wichtig ist – ka4eli

+0

@ ka4eli - vereinbart. Leistungsmäßig spielt es keine Rolle. JVM wird es wahrscheinlich nur entfernen und 'i' direkt verwenden. Die effektiv letzte Anforderung wird nur von javac zugunsten der Programmierer durchgesetzt. Die Laufzeit erfasst einfach den aktuellen Wert. – ZhongYu

+0

@ bayou.io sehr interessant, ich dachte nicht an JVM-Optimierungen. – Siddhartha

Antwort

12

Gibt es einen besseren Weg, dies zu tun?

Ich bezweifle es. Ihre Lösung sieht für mich in Ordnung, aber wenn Sie möchten, können sie in möglicherweise klareren Code neu schreiben wie:

IntStream.range(0, 100).forEach(
    i -> executor.execute(
     () -> doSomething(String.format("Need task number %d done", i)) 
    ) 
); 
+0

Das ist prägnant und ausgezeichnet. Ich werde es benutzen. Vielen Dank. – Siddhartha

2

Das ist der einfachste Weg, um es zum Laufen zu bringen. Du wirst es nicht besser machen.

+2

stimme zu. es sei denn, wenn wir ein Util 'Iterable '' '' (für (int i: range (0, 100)) 'hätten - wäre hier' i' effektiv final. – ZhongYu