[JAVA] Form Scala Fallklasse für einfache Anzeige

In den Kommentaren wurde mir gesagt, dass es eine Bibliothek namens PPrint gibt, die die Fallklasse so formatiert, dass sie leicht zu sehen ist. http://www.lihaoyi.com/PPrint/

Das Folgende ist die Methode mit commons-lang3, aber da die obige Bibliothek einfach zu verwenden ist, sollten Sie PPrint verwenden, es sei denn, es liegen besondere Umstände vor.


Ich wollte den Inhalt der Scala-Fallklasse formatieren und anzeigen. Ich werde die Formatierungsmethode freigeben, da es keinen Treffer gab, selbst wenn ich nach der Methode mit "Fallklasse Pretty Print" oder "Scala-Formatierungsausgabe" gesucht habe.

Formungsmethode

Weil die Scala-Fallklasse in eine Java Bean-äquivalente Klasse kompiliert wird Formatieren mit ToStringBuilder in Java commons-lang3.

commons-lang3: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3

Anzuzeigendes Objekt

Die folgenden Werte für Fallklassen werden formatiert und angezeigt.

code


case class Outer(title: String, note: Seq[Inner])
case class Inner(no: Int, memo: String)

val obj = Outer("Titel", Inner(1, "Iroha") :: Inner(2, "Nihohe")  :: Inner(3, "Staub") :: Nil)
println(obj)

console


Outer(Titel,List(Inner(1,Iroha), Inner(2,Nihohe), Inner(3,Staub)))

Formatieren und Anzeigen bis zur ersten Ebene der Ebenenklasse

Sie können den Wert eines Bean-Format-Objekts mithilfe von ReflectionToString von ToStringBuilder formatieren.

code


val text1 = ToStringBuilder.reflectionToString(obj, ToStringStyle.MULTI_LINE_STYLE)
println(text1)

console


Outer@1df5f8ae[
  title=Titel
  note=List(Inner(1,Iroha), Inner(2,Nihohe), Inner(3,Staub))
]

Zusätzlich zu den oben genannten Formaten zeigt ToStringStyle nur den Wert an und formatiert ihn in das JSON-Format.

ToStringStyle: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ToStringStyle.html

Hierarchische Fallklassen werden ebenfalls rekursiv formatiert und angezeigt

Mit MultilineRecursiveToStringStyle ist es möglich, den Inhalt von Feldern vom Typ case class rekursiv zu formatieren.

code


val text2 = ToStringBuilder.reflectionToString(obj, new MultilineRecursiveToStringStyle())
println(text2)

console


Outer@7c49cd0c[
  title=Titel,
  note=scala.collection.immutable.$colon$colon@772294c7[
    head=Inner@8acd465[
      no=1,
      memo=Iroha
    ],
    tl=scala.collection.immutable.$colon$colon@7d64ef3e[
      head=Inner@1e03c8f9[
        no=2,
        memo=Nihohe
      ],
      tl=scala.collection.immutable.$colon$colon@10f69849[
        head=Inner@7e9769ce[
          no=3,
          memo=Staub
        ],
        tl=scala.collection.immutable.Nil$@24d0643d[
          
        ]
      ]
    ]
  ]
]

Beispielcode

PrettyPrintApp.scala


import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.apache.commons.lang3.builder.MultilineRecursiveToStringStyle;

object PrettyPrintApp extends App {

  val obj = Outer("Titel", Inner(1, "Iroha") :: Inner(2, "Nihohe")  :: Inner(3, "Staub") :: Nil)

  println("--------------------------------------------------------------------------------")
  
  println("obj: ")
  println(obj)

  println("--------------------------------------------------------------------------------")

  println("ToStringStyle.MULTI_LINE_STYLE: ")
  val text1 = ToStringBuilder.reflectionToString(obj, ToStringStyle.MULTI_LINE_STYLE)
  println(text1)
  
  println("--------------------------------------------------------------------------------")
  
  println("MultilineRecursiveToStringStyle: ")
  val text2 = ToStringBuilder.reflectionToString(obj, new MultilineRecursiveToStringStyle())
  println(text2)
  
  println("--------------------------------------------------------------------------------")

}


case class Outer(title: String, note: Seq[Inner])
case class Inner(no: Int, memo: String)


Recommended Posts

Form Scala Fallklasse für einfache Anzeige
Ich habe Scala ~ [Klasse] ~ berührt