il seguente codice:Perché ci sono 2 frame stack per un richiamo lambda?
public static void main(String[] args) {
Collections.singleton(1).stream().forEach(i -> new Exception().printStackTrace());
}
stampe:
java.lang.Exception
at PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6)
at PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source)
at java.util.Collections$2.tryAdvance(Collections.java:4717)
at java.util.Collections$2.forEachRemaining(Collections.java:4725)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at PrintLambdaStackTrace.main(PrintLambdaStackTrace.java:6)
Come è l'invocazione lambda implementato? Perché ci sono 2 frame stack?
Questa è una buona domanda. Guarderò da quando sono interessato alla risposta me stesso. La mia ipotesi è che la JVM crei una classe anonima al momento dell'esecuzione. Uno stack proviene dal metodo utilizzato per creare la classe e il secondo dalla classe stessa. Ma è solo una supposizione. – Sekkuar
Vedere anche http://stackoverflow.com/q/16827262/2711488 – Holger