A suggestion to improve Text Blocks

Brian Goetz brian.goetz at oracle.com
Fri Jan 17 02:50:01 UTC 2020

This behavior is already available through the lines() method on 
String.  You can do:

     String items = """

     List<String> itemList = items.lines().collect(toList());
     String[] itemArray = items.lines().toArray(String[]::new);

Given that the functionality is readily available in an ordinary library 
method, introducing magic ad-hoc conversions in the language (which has 
probably 100-1000x the cost of a library method) seems ill-advised; they 
add lots of complexity and irregularity for little benefit.  (Magic 
conversions are not easily discoverable; they don't always cover the set 
of conversions you want and can't be extended, which often leads to 
complaints of "please also support conversion to <my favorite 
collection>; etc.)  Further, a magic way of slicing text blocks wouldn't 
apply to strings produced in other ways; on the other hand, an ordinary, 
well-specified method like String::lines can work on any string, 
regardless of its provenance.

I think what you really want, and are trying to get there indirectly, is 
_collection literals_.  Which is a useful, and far^3 more generally 
applicable feature, which we might be able to justify some day.  In the 
meantime, you can use general-purpose methods like List::of in its place:

     List<String> fruits = List.of("Apple",

which is only a few more characters than your example, but with less magic.

On 1/16/2020 6:26 PM, P Holder wrote:
> I would like to see the compiler be able to do a little more work
> while compiling Text Blocks, and to be able to handle these cases
> intelligently by treating each line (where it would have emitted a
> newline) as a separate element.
> String[] itemsInArray = """
>    Apple
>    Orange
>    Banana
>    Kiwi
>    """;
> which would result in itemsInArray [4], where itemsInArray[0] =
> "Apple" and itemsInArray[3] = "Kiwi"
> List<String> itemsInArray = """
>    Apple
>    Orange
>    Banana
>    Kiwi
>    """;
> which would result in an unmodifiable List<String> with entries like
> "Apple", "Orange", etc.

More information about the amber-dev mailing list