2017-04-12 14 views
-1

zu drucken habe ich versucht, so etwas wieWie eine Liste von Themen mit Java 8 Stream api

Thread 
     .getAllStackTraces() 
     .keySet() 
     .stream() 
     .map(
       $->{ 
        System.out.println 
        ($.getStackTrace()); 
        return $; 
        }); 

Ich mag das ist das Gefühl, nicht der beste Weg, es zu tun. Gibt es einen anderen Weg? Was ist der kürzeste Weg, es zu tun? Verwenden Sie die Stream API. (Müssen die gesamten Stack-Traces drucken)

+3

'forEach' ..... –

+3

Sie machen zusätzliche Arbeit, wenn Sie jede Stack-Trace zu bekommen?. Bevor jemand eine Lösung anspricht, ist das, wonach Sie suchen? (Sie sind übrigens keine Listen, sie sind 'StackTraceElement []' und sie können * teuer * generiert werden.) – Makoto

+0

Kannst du einen Code schreiben, der den richtigen Stack bekommt? – strash

Antwort

1

AKTUALISIERT (thx @Flown)

Versuchen Sie folgendes:

Thread 
     .getAllStackTraces() 
     .keySet() 
     .forEach($ -> System.out.println(Arrays.toString($.getStackTrace())); 
+0

hmm soll es drucken? – strash

+2

Man kann nicht einfach ein Array drucken und erwarten, dass die Ausgabe verständlich ist ... – Makoto

+2

Nun wickeln Sie die SYSOUT in 'Arrays.toString ($. GetStackTrace())' – Flown

4

wie etwa: Thread.getAllStackTraces().keySet().stream().map(Thread::getStackTrace).map(Arrays::toString).forEach(System.out::println)?


EDIT: Der obige Code erfordert einige Bearbeitung, um gut auszusehen. Hier ist eine Version mit schöner Formatierung:

Thread.getAllStackTraces() 
     .keySet() 
     .stream() 
     .map(Thread::getStackTrace) 
     .map(Arrays::asList) 
     .forEach(list -> System.out.println(list.stream() 
               .map(i -> i.toString()) 
               .collect(Collectors.joining("\n\t")))) 
+0

[Ljava.lang.StackTraceElement; @ 4c873330 [Ljava.lang.StackTraceElement; @ 119d7047 [Ljava.lang.StackTraceElement; @ 776ec8df [Ljava.lang.StackTraceElement; @ 4eec7777 [Ljava.lang.StackTraceElement; @ 3b07d329 das ist es, was es druckt !!!! NICHT DIE RICHTIGE ANTWORT – strash

+2

Es sollte das selbe drucken, das Sie vorher erwähnt haben. Wenn Sie möchten, dass etwas anderes gedruckt wird, ändern Sie einfach die '' System.out :: println''' zu einer Funktion Ihrer Wahl – Igor

+0

brauchen die ganzen stacktraces – strash

5

Sind Sie sich bewusst, dass Thread.getAllStackTraces() eine Map zurückgibt, die bereits alle Stack-Traces enthält? Iterieren über die Thread Keyset, um Thread.getStackTrace() für jeden von ihnen zu nennen, ist nicht nur eine Verschwendung von Ressourcen, sondern erhöht auch die Chancen, weniger nützliche Ergebnisse zu erhalten, wie Threads können während Sie iterieren beendet, was zu leeren Stack-Traces führt, während die Map enthält einen Snapshot, der zu dem Zeitpunkt erstellt wurde, als Sie getAllStackTraces() aufgerufen haben.

Sie können einfach die Werte iterieren statt:

Thread.getAllStackTraces().values().stream() 
     .flatMap(Arrays::stream) 
     .forEach(System.out::println); 

Während dies die Anforderung erfüllt nur alle Stack-Traces drucken, diese unformatierte Ausgabe ist unwahrscheinlich, nützlich zu sein.

können Sie bevorzugen:

Thread.getAllStackTraces().forEach((t,st) -> { 
    System.out.printf("Thread %4d %-20s %13s pri=%d%n", 
         t.getId(), t.getName(), t.getState(), t.getPriority()); 
    Arrays.stream(st).forEachOrdered(ste -> System.out.println("\tat "+ste)); 
}); 
Verwandte Themen