Единственный способ добиться этого, imho, - создать вспомогательный класс:
public class FileUtil {
String fileName;
File file;
boolean delete = true;
public FileUtil(String fileName, File file) {
super();
this.fileName = fileName.substring(0, fileName.indexOf("."));
this.file = file;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public boolean isDelete() {
return delete;
}
public void setDelete(boolean delete) {
this.delete = delete;
}
@Override
public String toString() {
return "FileUtil [fileName=" + fileName + ", file=" + file + ", delete=" + delete + "]";
}
}
тогда вы можете использовать это для сбора и удаления ваших предметов:
try (Stream<Path> paths = Files.walk(Paths.get("c:/yourPath/"))) {
List<FileUtil> listUtil = new ArrayList<FileUtil>();
paths
.filter(Files::isRegularFile)
.map(filePath -> filePath.toFile())
.collect(Collectors.toList())
.forEach(file -> listUtil.add(new FileUtil(file.getName(), file)));
Map<String, List<FileUtil>> collect = listUtil.stream()
.collect(Collectors.groupingBy(FileUtil::getFileName));
for(String key : collect.keySet() ) {
List<FileUtil> list = collect.get(key);
if(list.size() > 1) {
list.stream().findFirst().ifPresent(f -> f.setDelete(false));
list.stream()
.filter(fileUtil -> fileUtil.isDelete())
.forEach(fileUtil -> fileUtil.getFile().delete());
}
}
} catch (IOException e) {
e.printStackTrace();
}
Таким образом, я сохраняю случайный элемент, если вы предпочитаете, вы можете изменить класс так, чтобы он содержал только то расширение, которое вам нужно, например .png
Надеюсь, это поможет:)