File.separator の処理

ファイルのPATH  Windows でも Linux でも、階層に分けた同じ結果リストを求める。
どういう課題かというと、、、

Windows

c:\a\b\c

Linux

/a/b/c

とある時、

a
a/b
a/b/c

というリストを改行出力した結果を得たい。
Windows 環境の PATH であろうが、Linux環境であろうが、同じ結果が欲しい。
ちょうど、Stream の collect 集計の練習になる。

String path に、格納されているとして、以下のようになる。

List<String> list = Stream.of(path.split(File.separator.equals("\\") ? "\\\\" : "/"))
.filter(s->s.length() > 0 && !s.matches("^[a-zA-Z]:$"))
.collect(()->new ArrayList<String>(), (r, s)->{
   if (r.size() < 1){
      r.add(s);
   }else{
      r.add(r.get(r.size()-1) + "/" + s);
   }
}, (r, t)->r.addAll(t));

もっと短く書けるはずで、、

List<String> list = Stream.of(path.split(File.separator.equals("\\") ? "\\\\" : "/"))
.filter(s->s.length() > 0 && !s.matches("^[a-zA-Z]:$"))
.collect(()->new ArrayList<String>()
, (r, s)->r.add((r.size() < 1 ? "" : r.get(r.size()-1) + "/") + s)
, (r, t)->r.addAll(t));

これで、

list.stream().forEach(e->{
   System.out.println(e);
});
a
a/b
a/b/c