RFR: 8287834: Add SymbolLookup::or method [v3]
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon May 22 09:53:36 UTC 2023
On 17/05/2023 02:33, John Hendrikx wrote:
> SymbolLookup lookUp = name -> library1.find(name)
> .or(() -> library2.find(name))
> .or(() -> loader.find(name));
What you say is true - e.g. the fact that a lookup returns an optional
can be used to chain multiple lookups as you describe.
There are, however some difference - note that your example only uses
"captures" symbol lookup variable names - so the full code would be more
something like:
```java
SymbolLookup library1 = SymbolLookup.libraryLookup("lib1", arena);
SymbolLookup library2 = SymbolLookup.libraryLookup("lib2", arena);
SymbolLookup loader = SymbolLookup.loaderLookup();
SymbolLookup lookUp = name -> library1.find(name)
.or(() -> library2.find(name))
.or(() -> loader.find(name));
```
Without the initial setup, we could try to write something like this:
```java
SymbolLookup lookUp = name -> SymbolLookup.libraryLookup("lib1",
arena).find(name)
.or(() -> SymbolLookup.libraryLookup("lib2", arena).find(name))
.or(() -> SymbolLookup.loaderLookup().find(name));
```
But this more compact version has several issues. First, it creates a
new library lookup on each call to "find" (possibly more). Second, the
loader in which the lookup is retrieved depends on who calls the "find"
method.
So, the more compact version is not "like for like" for the more verbose
option above. And this is due to the fact that, in most cases,
retrieving a symbol lookup has some side-effects, such as loading a
library - it is *not* a purely functional process.
With the new method, it becomes like this:
```java
SymbolLookup lookUp =SymbolLookup.libraryLookup("lib1", arena)
.or(SymbolLookup.libraryLookup("lib2", arena))
.or(SymbolLookup.loaderLookup());
```
So, not only the new method results in more succinct code (compared to
the alternatives), but it also combines symbol lookups in the "right
way", so that the chain of lookups is defined, once and for all, when
the composite lookup is first created.
Cheers
Maurizio
More information about the core-libs-dev
mailing list