espiritual:
Eu tenho um diretório chamado /home/ftp
que contém sub-diretórios como esta:
dir1
dir2
dir3
dir1.ok (this is just an empty file)
dir3.ok (this is just an empty file)
O código só deve processar os arquivos em diretórios que têm um correspondente ".ok"
arquivo. Assim, por exemplo. Neste exemplo, o código deve escolher os arquivos para processamento que são encontrados sob dir1
e dir3
, mas não dir2
.
Eu poderia fazer isso da maneira "normal":
List<String> list = Arrays.asList(new File("/home/ftp").list());
Set<String> set = new HashSet<>();
List<String> dirToProcess = new ArrayList<>();
for (String name : list){
name = name.contains(".ok") ? name.substring(0, name.indexOf(".ok")) : name;
if (!set.add(name)){
dirToProcess.add(name);
}
}
// now dirToProcess contains the directory names which should be processed
Mas eu realmente quero fazer isso usando Java funcional (estou usando Java8) usando Streams. Como posso refatorar esse código para alcançá-lo?
também:
Acho que o que você está esperando como uma saída é:
List<String> dirToProcess = list.stream()
.filter(name -> name.contains(".ok") && list.contains(name.substring(0, name.indexOf(".ok"))))
.map(name -> name.substring(0, name.indexOf(".ok")))
.collect(Collectors.toList());