MumbleCloseable goes backward

Howard Lovatt howard.lovatt at gmail.com
Thu Jun 27 03:58:55 PDT 2013


On 27/06/2013, at 8:51 PM, Remi Forax <forax at univ-mlv.fr> wrote:

> On 06/27/2013 12:38 PM, Paul Sandoz wrote:
>> On Jun 27, 2013, at 12:19 PM, Remi Forax <forax at univ-mlv.fr> wrote:
>> 
>>> A Stream should be AutoClosable or MaybeCloseable, or MaybeMaybeNotCloseable ...
>>> because using a TWR here goes in the wrong direction, the Stream API is fluent, from left to right and
>>> the TWR is right to left because you have to declare a local variable and type it (again unlike the Stream API).
>>> 
>>> So instead of:
>>>  try (Stream<Path> stream = Files.walkFile(directory)) {
>>>    stream.forEach(path -> {
>>>       ...
>>>    });
>>>  }
>>> which is an external way to manage the resources.
>>> 
>>> Because we have lambda, we should promote the internal way to manage the resources, like the rest of the Stream API,
>>> so walkFile should be written to take a Function<Stream, R>, like this:
>>>  Files.walkFile(directory, stream -> stream.forEach(path -> {
>>>    ...
>>>  });
>>> with the TWR written around the call to the function inside walkFile.
>>> 
>>> so there is *no need* for a Mumble Closeable.
>> - R could be Stream.
> 
> yes, this has to be documented, but because the result value will be a closed Stream,
> there is no issue, it will bark at first use.
> 
>> 
>> - ain't gonna work for flatMap:
>> 
>>   Files.walk(dir, sp-> sp.flatMap(p -> Files.lines(p, Function.identity()))...);
> 
> you can return void/null, no ?
> 
>> 
>> - much harder to read than:
>> 
>>   Files.walk(dir).flatMap(Files::lines)...
> 
> which leak resources.

The following wouldn't leak:

Files.walk( () -> dir ).flatMap(Files::lines)...

Because you would open the resource inside a TWR in the terminal operation, i.e. make opening a resource lazy. 

> 
>> 
>> Paul.
> 
> Rémi
> 


More information about the lambda-libs-spec-observers mailing list