JShell vs Optional.get()

Robert Field robert.field at oracle.com
Thu Apr 28 03:06:27 UTC 2016


Thanks much, Stuart!

I've created:  https://bugs.openjdk.java.net/browse/JDK-8155581

to address this issue.

-Robert

On 04/27/16 18:37, Stuart Marks wrote:
> (new thread spawned from "Fwd: RFR(m): 8140281 deprecate Optional.get()")
>
>> Thumbs up to JShellTool code.
>
> Thanks. The original changeset seems to have been ... ah ... 
> sidetracked, so I probably won't be pushing the change from get() to 
> getWhenPresent() anytime soon.
>
> Meanwhile, I'll explain in a bit more detail about some issues I see 
> in the particular bit of JShell code that uses Optional.get(). I had 
> said:
>
>>> I think this code can be cleaned up and replaced with a call to
>>> String.join(). I'd be happy to help with this as part of a separate
>>> changeset.
>>
>> Always happy to get code improvements.
>
> Thanks for being receptive to comments.
>
> From the earlier webrev,
>
> http://cr.openjdk.java.net/~smarks/reviews/8140281/webrev.0.langtools/
>
> if you look in 
> src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java, 
> there is the following code:
>
> 1198             int length = 0;
> 1199             int first = replayableHistory.size();
> 1200             while(length < Preferences.MAX_VALUE_LENGTH && 
> --first >= 0) {
> 1201                 length += replayableHistory.get(first).length() + 
> sepLen;
> 1202             }
> 1203             String hist = replayableHistory
> 1204                     .subList(first + 1, replayableHistory.size())
> 1205                     .stream()
> 1206                     .reduce( (a, b) -> a + RECORD_SEPARATOR + b)
> 1207                     .get();
>
> The problem here is that get() will throw an exception if reduce() 
> returns an empty Optional, which it can, based on my reading of the 
> code. Changing this to the [proposed] getWhenPresent() makes this a 
> bit more explicit, but doesn't fix the problem.
>
> The usual fix is to use one of the Optional methods that handles the 
> empty case. Instead of get(), for example, one might call 
> orElse("default") to supply a default string value.
>
> But looking further, I note that the reduce() lambda is a (flawed) 
> idiom for joining strings with a separator. In Java 8 we introduced a 
> String.join() method which does this, avoiding the need for a stream 
> entirely. It also handles the empty case correctly.
>
>     String hist = String.join(RECORD_SEPARATOR,
>         replayableHistory.subList(first + 1, replayableHistory.size()));
>
> s'marks
>



More information about the kulla-dev mailing list