Files.list(Paths.get(".")) // Stream aller Pfade im aktuellen Verzeichnis (".") erzeugen
.map(Path::getFileName) // von jedem Pfad nur das letzte Element (=Dateiname) betrachten
.map(Path::toString) // und zwar als String
.map(x -> (x.lastIndexOf('.') > 0 ? x.substring(0, x.lastIndexOf('.')) : x)) // die Extension, falls vorhanden, abschneiden
.forEach(System.out::println) // und ausgeben
public static void main(String[] args) throws IOException {
Files.list(Paths.get("."))
.map(Path::getFileName)
.map(Path::toString)
.collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf(".")))
.entrySet().stream()
.filter(e -> e.getValue() >= 0)
.map(e -> e.getKey().substring(e.getValue(), e.getKey().length()))
.forEach(System.out::println);
}
Das finde ich aber schwerer lesbarer - ab der toMap Funktion muss ich genau überlegen, was passiert.Oder so:
Java:public static void main(String[] args) throws IOException { Files.list(Paths.get(".")) .map(Path::getFileName) .map(Path::toString) .collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf("."))) .entrySet().stream() .filter(e -> e.getValue() >= 0) .map(e -> e.getKey().substring(e.getValue(), e.getKey().length())) .forEach(System.out::println); }
Du hattest zweimal den lastIndexOf Aufruf und den ternären Operator.
Deshalb sagte er ja auch, den Teil in eine extra Funktion auslagern. Der ternäre Operator ist dem Lambda geschuldet.Nein, den ternären Operator sollte man in Streams vermeiden, er verschlechtert die Lesbarkeit.
Java:
|
Java:
|
Ob die Dateiendung korrekt entfernt wird.Was möchtest du denn testen? Ob "e.getValue() >= 0" das richtige Ergebnis zurück gibt?
Ob folgendes passiert:Nein, den ternären Operator sollte man in Streams vermeiden, er verschlechtert die Lesbarkeit. Was möchtest du denn testen? Ob "e.getValue() >= 0" das richtige Ergebnis zurück gibt?
Eingabe | Ausgabe |
a.txt | a |
.txt | |
a.b.c.txt | a.b.c |
a.txt. | a.txt |
a | a |
Ja, aus Gründen der Faulheit habe ich auf die Einführung einer Methode verzichtet.Du hattest zweimal den lastIndexOf Aufruf und den ternären Operator.
Dabei sollte aber .txt das Ergebnis sein, so wie @mihe7's Code das auch macht
Wie bist du denn drauf?dass dein Code im Gegensatz zu dem von @mihe7 falsch ist
public static void main(String[] args) throws IOException {
Files.list(Paths.get("."))
.map(Path::getFileName)
.map(Path::toString)
.collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf(".")))
.entrySet().stream()
.filter(e -> e.getValue() > 0) // write >= 0, if you want empty Strings
.map(e -> e.getKey().substring(0, e.getValue()))
.forEach(System.out::println);
}
for(String x: new File(".").list()){
System.out.println(x.lastIndexOf('.') > 0 ? x.substring(0, x.lastIndexOf('.')) : x);
}
Hat Tobias wieder einen neuen Account?Wie bist du denn drauf? Du bist falsch hier, ansonsten keiner. Geh nochmal die Lernbank drücken.
Weil es im ersten Post stehtDer . gehört mit zur Dateiendung.
Wie bist du denn drauf?
Immer noch falsch, weil Dateien ohne Endung weiterhin ausgefiltert werden.Wenn der vordere Teil gewünscht ist, dann eben so, aber so viel Transferleistung hätte ich von jedem erwartet:
Java:public static void main(String[] args) throws IOException { Files.list(Paths.get(".")) .map(Path::getFileName) .map(Path::toString) .collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf("."))) .entrySet().stream() .filter(e -> e.getValue() > 0) // write >= 0, if you want empty Strings .map(e -> e.getKey().substring(0, e.getValue())) .forEach(System.out::println); }
In der Aufgabe steht nirgendwo, was mit "foo.", ".bar" und "baz" passieren soll, von daher lässt sich gar nicht sagen das sei falsch...Weil es im ersten Post steht
public static void main(String[] args) throws IOException {
Map<Boolean, List<String>> groups = Files.list(Paths.get(".")).map(Path::getFileName).map(Path::toString)
.collect(Collectors.groupingBy(s -> s.contains(".")));
groups.get(true).stream().map(s -> s.substring(0, s.lastIndexOf("."))).forEach(System.out::println);
groups.get(false).stream().forEach(System.out::println);
}
Files.list(Paths.get("."))
.map(FileHelper::getFileNameWithoutSuffix)
.forEach(System.out::println);
Es lässt sich völlig eindeutig sagen, dass der Code falsch war. Nur die Endung zurückgeben ist einfach das völlige Gegenteil von "Dateinamen ohne Endung".In der Aufgabe steht nirgendwo, was mit "foo.", ".bar" und "baz" passieren soll, von daher lässt sich gar nicht sagen das sei falsch...
Allerdings ist kaum etwas hässlicher als eine Map für sowas zu missbrauchen, nicht mal Fallunterscheidung in Streams.Eine Fallunterscheidung in Streams ist immer hässlich... Insofern ist "GrünerPlanet" zuzustimmen.
Bestätigst du dich nun selber?..Eine Fallunterscheidung in Streams ist immer hässlich... Insofern ist "GrünerPlanet" zuzustimmen.
Wurde doch in #13 verbessert, wieso beziehst du dich nicht auf den neusten Stand?Nur die Endung zurückgeben ist einfach das völlige Gegenteil von "Dateinamen ohne Endung"
Weil sich der von dir zitierte Teil nicht auf #13 bezog.Wurde doch in #13 verbessert, wieso beziehst du dich nicht auf den neusten Stand?
Die Idee war mir auch schon gekommen...Bestätigst du dich nun selber?..