2015-07-28 15 views
6

szukam definicji elementów, które występuje wokół lambda w Java 8 stosu śladu

Na przykład ten kod

Object inputData = someData(); 

myList.stream().forEach(listItem -> { 

    Query query = (Query) listItem.getSingle().apply(this.getId()); 

    Object data = diffUtils.applyProjection(query, inputData); 

    myStringCollection.stream() 
     .filter(destination -> myPredicateMethod(listItem, destination)) 
     .forEach(destination -> myProcessMethod(destination, data)); 
} 

czasami daje ten wyjątek.

at [CLASS].lambda$null$2([CLASS].java:85) 
at [CLASS]$$Lambda$64/730559617.accept(Unknown Source) 

Jakie są różne części opisujące w wyjątku? Co mówią mi "puste", "2", "64", "730559617" i "Nieznane źródło"?

Bardziej rozbudowany przykład można znaleźć tutaj (ale tutaj "brak" w moim wyjątku powyżej nie jest obecny). http://blog.takipi.com/the-dark-side-of-lambda-expressions-in-java-8/

+0

Prawdopodobny duplikat [Identyfikowanie lambdas w stosie w Java 8] (http://stackoverflow.com/questions/29435888/identifying-lambdas-in-stacktrace-in-java-8) –

Odpowiedz

3

Nie ma standardowej definicji dla tej wygenerowanej nazwy klasy. Jest to celowe, aby uniknąć pisania kodu, który zależy od tego, co utrudnia później projektantom zmianę.

To powiedziawszy, niewiele można przeczytać;

  • pierwsza część nazwy klasy to klasa strony wywoławczej.
  • Liczba przed ostatnim $ jest globalnym licznikiem dla lambda. Zależy to od kolejności generowania kodu lambda.
  • duża liczba to wygenerowany identyfikator. Różni się on dla tej samej wartości lambda za każdym razem, gdy biegasz, ale nie zmienia się po rozpoczęciu.

"Nieznane źródło" informuje, że wygenerowany kod nie zawiera powiązanych z nim informacji diagnostycznych.

Szukamy biblioteki do zmiany toString dla lambda, aby dać wyobrażenie o kodzie z nim powiązanym. tzn. będzie wyglądać jak kod lambda przynajmniej dla drobnych spraw.