Groovy Closures /FileBot

Schattenfänger

Lt. Junior Grade
Registriert
Nov. 2010
Beiträge
273
Hallo,
Ich habe hier so ein Programm gefunden namens Filebot, welches zum umbenennen von Filmen und Serien ist.

Dabei kann man eben, dass Pattern für den neuen Namen selbst bestimmten und anscheinend funktionieren Schleifen nur als Closures.

Ich habe hier tests.language, welches ein Array darstellt.
Inzwischen bin ich draufgekommen, dass man mit
Code:
texts.language.each(){item ->System.out.println item }
Das gesamte Array ausgibt.
In meinem Fall hat es neun Einträge. Wobei zB en dreimal vorkommt.
Ich möchte jetzt einfach nur die jeweiligen Einträge auslesen und zusammenführen. Wobei mehrfach Einträge natürlich nur 1x vorkommen sollen. Zudem den String noch bearbeiten
Jetzt habe ich es mal so:
Code:
texts.language.each(){item ->item.equals('en') ? 'asd' : 'a'}
Aber interessanterweise erhalte ich noch immer das gesamte Array.
Und mit dem
Code:
fullString="";texts.language.each(){fullString += it +""};System.out.println fullString
bekomm ich gar keine Ausgabe, obwohl es in einem Tutorial so angegeben ist.

Ich finde bei diesen ganzen Tutorials einfach nicht wie ich in einem Closure eine if-Abfrage machen kann.
Wäre wirklich super, wenn mir jemand da weiterhelfen kann oder nen Link zu nem brauchbaren Tutorial weiß (Werd mir Closures wohl eh mal für Java anschauen)

mfg
 
Wenn du es unique haben willst verwend doch einfach ein Set, alternative kannst auch .unique auf einer List verwenden.
Ansonsten empfehl ich es bei each auch immer den Type anzugeben. Ansonsten wird Code langfristig unlesbar.
Folgendes Code Beispiel ergibt folgenden Output:

result: de en

Code:
String[] languages = ["en", "en", "de"]
Set<String> languagesList = languages as Set
String result = ""
languagesList.each { String language ->
  result += language + " "
}
println "result: " + result
 
Hehe, danke sehr.
Dass, man ggf auch mal zwischen verschiedenen Datenstrukturen hin und her wechseln kann vergesse ich wirkich gerne mal.

Bei dem each() wird also automatisch, dass erste Argument als "Eingabeparameter" angenommen und kann dann damit weiter arbeiten. eine foreach halt.

Kommt mir das nur so vor oder ist Groovy eine relativ "schnelle" Sprache um etwas kleines zu entwicklen?
 
Schneller entwickeln alleine ja. Du kannst halt sehr viel macht in sehr wenig Code bündeln. Das kann schnell dazu führen dass ihn jemand anders nur durch genaues anschauen versteht. Daher ist es da vor allem wichtig auf die Lesbarkeit des Codes zu achten.
Das ist auch der Grund warum ich den Typ bei dem each hingeschrieben hab auch wenn es nicht notwendig ist. Ich halte es auch für sehr schlecht den default iterator "it" zu verwenden. Das wird dann richtig lustig wenns verschachtelt ist.
 
Hey, ich hätte noch eine Frage.

Wenn ich zudem die länge von einem bestimmten Teilstring begrenzen möchte. Aber es nicht willkürlich nach ~20 Zeichen abschneiden sondern zB bei einem -.,;' usw wie würd ich das am Besten machen?

Bsp.:
"Hallo! Es ist heute, wirklich ein Regen. asdfsadfddd

Mit subString würde ich es bei asd abschneiden, aber ich möchte stattdessen, dass . der letzte wäre. In java würd ich jetzt einfach mal an die nte Position gehen und nach links durchlaufen lassen, bis ich so ein Zeichen finde. Oder den String einfach Tokenizieren.
Gibt es da einen schönen und vor allem kurzen weg mit Regexes?
 
String.splitEachLine(String regex, Closure closure} sollte den zweck für dich erfüllen. Regex pattern hängt halt davon ab was du jetzt genau brauchst.
Falls mal mit fixed size und ... enden lassen willst, kannst StringUtils.abbreviate(String str, int maxWidth) verwenden (apache commons). Das kennen die meisten nicht.
 
Zurück
Oben