[ https://issues.apache.org/jira/browse/JEXL-342?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17270914#comment-17270914 ]
Garret Wilson edited comment on JEXL-342 at 1/24/21, 4:02 PM: -------------------------------------------------------------- To get really wil To get really wild, we could get the Elvis operator working, too. Using the API in the description, I would want to have the following JEXL expression work equivalent to the Java code {{foo.findBar("test").map(Bar::getName).orElse("unavailable")}}: {code} foo.bar("test").name ?: "unavailable" {code} I realize that under the hood this could get pretty complicated and that the current design of JEXL may not be amenable to this, so I didn't place it in the main feature request description. But it does show the sort of native support that would be nice. In the least, recognizing the {{findXXX()}} getter pattern and turning {{Optional<>}} to a nullable by calling {{orElse(null)}} during instance tree traversal (and treating as you normally would treat a {{null}} return value to short-circuit expression evaluation) should be completely doable and likely not too much trouble. was (Author: garretwilson): To get really wil To get really wild, we could get the Elvis operator working, too. Using the API in the description, I would want to have the following JEXL expression work equivalent to the Java code {{foo.findBar("test").map(Bar::getName).orElse("no such bar")}}: {code} foo.bar("test").name ?: "no such bar" {code} I realize that under the hood this could get pretty complicated and that the current design of JEXL may not be amenable to this, so I didn't place it in the main feature request description. But it does show the sort of native support that would be nice. In the least, recognizing the {{findXXX()}} getter pattern and turning {{Optional<>}} to a nullable by calling {{orElse(null)}} during instance tree traversal (and treating as you normally would treat a {{null}} return value to short-circuit expression evaluation) should be completely doable and likely not too much trouble. > Support for Java Optional. > -------------------------- > > Key: JEXL-342 > URL: https://issues.apache.org/jira/browse/JEXL-342 > Project: Commons JEXL > Issue Type: New Feature > Affects Versions: 3.1 > Reporter: Garret Wilson > Priority: Major > > Does JEXL provide any native support for Java 8+ {{Optional<>}}? If not can > this this easily be added as some sort of plugin, or better yet can it be > added to the library? > h3. {{Optional}} Traversal > I need to create an API that works well for application developers as for > those using templates with JEXL expressions. Let's say that the {{Bar}} class > has a {{Bar.getName()}}. And the {{Foo}} class has this method: > {code:java} > Optional<Bar> getBar(String barId); > {code} > In code getting the "test" foo-bar name would be like this: > {code:java} > String fooBarName=foo.getBar("test").map(Bar::getName).orElse(null); > {code} > I want the navigation across {{Optional<>}} to work just as if it were a > nullable variable. That is, I want the following JEXL expression to give the > same result as {{fooBarName}} above: > {code} > foo.bar("test").name > {code} > If {{Foo.getBar(String)}} returned a nullable rather than an {{Optional<>}}, > I think JEXL would work for this already. but the whole point of > {{Optional<>}} is that I keep nullables out of my code, so I don't want to > create inferior APIs inconsistent with the rest of my project just to work > with JEXL. > h3. {{Optional}} Getter Name > As icing on the cake, I would like to have {{Optional<>}} returning getter > discovery to recognize the {{findXXX}} pattern, as [Stephen Colebourne > suggested|https://blog.joda.org/2015/09/naming-optional-query-methods.html]. > I've been using this pattern for several years, and I really like it. Thus to > indicate that the {{Foo.getBar(String)}} "getter" doesn't return a nullable > but an {{Optional<>}}, I would name it {{Foo.findBar(String)}}, like this: > {code:java} > Optional<Bar> getBar(String barId); > {code} > I would thus want the exact same JEXL expression above to still work: > {code} > foo.bar("test").name > {code} > Otherwise I'll have to forego use of modern Java constructs and make an > outdated style and less safe API just to get JEXL to work. -- This message was sent by Atlassian Jira (v8.3.4#803005)