The last post discussed exception handling with KλudJe in broad terms. This post presents a more practical example with the Stream type and I/O.
Streaming I/O Example
Here is a simple type that counts the number of lines in a collection of files:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Stream;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.stream.Collectors.toConcurrentMap;
import static uk.kludje.fn.function.UFunction.asUFunction;
/** Line counter - stream approach with checked exception handling. */
public class LineCounterDemo {
public Map<Path, Long> countLines(Collection<? extends Path> paths) throws IOException {
return paths.stream()
.parallel()
.collect(toConcurrentMap(p -> p, asUFunction(this::linesIn)));
}
private long linesIn(Path path) throws IOException {
try (Stream<String> lines = Files.lines(path, UTF_8)) {
return lines.count();
}
}
}
The saving here is in the line .collect(toConcurrentMap(p -> p, asUFunction(this::linesIn)));.
Without the UFunction type I/O
exceptions would have to be wrapped and unwrapped with try/catch code.
Note that IOExceptions must still be handled by callers because of the countLines method signature.
See the KλudJe documentation for more details on the above example.
No comments:
Post a Comment
All comments are moderated