There are many ways to invent a syntax for embedding a block within an expression (gcc allows a block to appear within immediately enclosing parentheses), but using the “do” keyword could be problematic within Java because in principle there could be some confusion with the “do { … } while(x)” statement. Consider the statement:
do { blah blah blah; if (p) yield myCollection; blah blah blah; yield otherCollection; }.add(x); It sure looks like a loop until you get to that last line and realize it’s really an expression statement. —Guy > On Mar 23, 2020, at 10:23 PM, Tagir Valeev <amae...@gmail.com> wrote: > > Hello! > > Now we have a legal way to execute several statements within an expression, > yielding the result with a yield statement. This could be done via `switch` > expression. > > Sometimes it's desired to do this without any switch. One may abuse the > switch expression feature writing `switch(0) { default -> { ... code block > ending with 'yield' }}`. > > How about creating a special syntax for such kind of expression. It could > look like `do { ... code block ending with 'yield' }`? > > E.g. consider: > > class X { > static final String field; > > // now we are forced to split field declaration and initialization > // also initializer could be long and it could be not evident that its main > purpose > // is to initialize the field > static { > try { > field = initializeField(); > } > catch(CheckedException e) { > throw new RuntimeException(e); > } > } > } > > Since Java 14 we can write > > class X { > // field declaration and initialization in the same place: easier to > navigate through code > // though we are abusing the switch expression > static final String field = switch(0) { default -> { > try { > yield initializeField(); > } > catch(CheckedException e) { > throw new RuntimeException(e); > } > }}; > } > > It could be like > > class X { > // concise syntax. Now we know that the main block purpose > // is to initialize the field > static final String field = do { > try { > yield initializeField(); > } > catch(CheckedException e) { > throw new RuntimeException(e); > } > }; > } > > It's similar to Perl 'do BLOCK' expression > https://perldoc.perl.org/functions/do.html > <https://perldoc.perl.org/functions/do.html> > > What do you think? > > With best regards, > Tagir Valeev