Another idea to solve the long-standing issue with checked IOExceptions in
"close()" calls is to
add a method to java.io.Closeable, now possible thanks to default methods:

/**
* Invokes #close() and wraps IOExceptions with UncheckedIOExceptions.
*/
default void closeUnchecked() {
   try { close(); } catch(IOException e) { throw new
UncheckedIOException(e); }
}

This would at least make it possible to pass
"closeableInstance::closeUnchecked" to Stream.onClose(Runnable).


2013/11/18 Peter Levart <peter.lev...@gmail.com>

> On 11/18/2013 03:28 PM, Brian Goetz wrote:
>
>> Which means that, if your stream holds non-memory resources, the
>> flatMapper should create a stream that closes the underlying stream, like:
>>
>>   blah.flatMap(path -> {
>>      BufferedReader br = new BufferedReader(path);
>>      return br.lines.onClose(br::close);
>>   }
>>   ...
>>
>
> ...the only problem with above code is that it doesn't compile, because of
> IOException declared on BufferedReader (FileReader actually!) constructor
> and BufferedReader.close() method. The solutions to this have already been
> discussed on the list some time ago, and one of the propositions was to
> create interfaces like:
>
>
> public interface IOFunction<T, R> extends Function<T, R> {
>     default R apply(T t) {
>         try {
>             return applyIO(t);
>         } catch (IOException e) {
>             throw new UncheckedIOException(e);
>         }
>     }
>
>     R applyIO(T t) throws IOException;
> }
>
>
> public interface IORunnable  extends Runnable {
>     default void run() {
>         try {
>             runIO();
>         } catch (IOException e) {
>             throw new UncheckedIOException(e);
>         }
>     }
>
>     void ruinIO() throws IOException;
> }
>
>
> ...etc, and use them in code like this:
>
>
> List<String> paths = ...
> paths
>     .stream()
>     .flatMap((IOFunction<String, Stream<String>>) path -> {
>         BufferedReader br = new BufferedReader(new FileReader(path));
>         return br.lines().onClose((IORunnable) br::close);
>     })
>     .forEach(System.out::println);
>
>
>
> Regards, Peter
>
>
>

Reply via email to