口:
現在、私は拡張子を持つ私にファイル名を返していると私は、Java 8のストリームAPIを使用していますことを行うにはいくつかのコードを持っています。しかし、私はよく、同じストリーム内の文字列をトリミングするようにしたいと思います。
return Files.walk(Paths.get(qPath))
.filter(extension -> extension.toString().endsWith(".txt"))
.map(Path::getFileName)
.findFirst()
.map(Path::toString)
.get();
ストリーム内の文字列から.txtファイル削除する方法任意のアイデア?
ホルガー:
あなたは、文字列に複数回のパスを変換することにより、資源を無駄にしています。意図した最終結果は、とにかく文字列である場合は、あなたがそれを繰り返す必要はありませんので、最初のステップとして、文字列の右にマッピングすることができます。
return Files.walk(Paths.get(qPath))
.map(p -> p.getFileName().toString())
.filter(name -> name.endsWith(".txt"))
.map(name -> name.substring(0, name.length()-".txt".length()))
.findFirst()
.get();
それはあなたが最後の場所はありません問題かどうかという注意.map(…)
の前のステップはfindFirst()
、つまりはストリームにそれを適用する、またはそれの後にそれを適用しますOptional
。ストリームの怠惰な性質のために、それはまだここだけ最初に一致した要素に適用されます。しかし、私は維持好む.endsWith(".txt")
テストとその後に.substring(0, name.length()-".txt".length())
この2つのステップの間の関係をより明確にするために、できるだけ近く一緒にと。