Stream API进阶
映射
遍历文件后返回一个FileSize 对象:
class FileSize { private final File file; private final Long size; FileSize(File file, Long size) { this.file = file; this.size = size; } File getFile() { return file; } Long getSize() { return size; } String getName() { return getFile().getName(); } String getFirstLetter() { return getName().substring(0, 1); } @Override public String toString() { return Objects.toStringHelper(this) .add("file", file) .add("size", size) .toString(); } } |
最终进行映射的代码:
File[] files = new File("c:/windows").listFiles();
List<FileSize> result = Stream.of(files)
.map(FileSize::new)
.collect(Collectors.toList());
分组:
按文件名的第一个字母将FileSize对象分组
Map<String, List<FileSize>> result = Stream.of(files)
.map(FileSize::new)
.collect(Collectors.groupingBy(FileSize::getFirstLetter));
Reduce
找出文件夹下的最大最小文件:
Optional<FileSize> filesize = Stream.of(files)
.map(FileSize::new)
.reduce((fs1, fs2) -> fs1.getSize() > fs2.getSize() ? fs1 : fs2);
如果你不需要FileSize对象,只需要一个数值的话:
OptionalLong max = Stream.of(files)
.map(FileSize::new)
.mapToLong(fs -> fs.getSize())
.max();