Blog

Maria Jose Herrera

July 26, 2024

Spread the word


Share your thoughts

A Powerful addition to BoxLang’s Java interoperability!

We're excited to announce we’ve added more goodies to our BoxLang Java interop: method references and higher-order functions. These enhancements elevate Java integration, making your development experience more powerful and seamless than ever before.

Review Original Post

Java Method References

In CFML, you can grab a reference to a UDF or closure, pass it around, and invoke it. BoxLang extends this to Java methods, both instance and static. Check this out:


myInstance = new myClass();
myInstanceMethod = myInstance.myMethod;
myInstanceMethod();

And for static methods:


myStaticUDF = src.test.java.TestCases.phase3.StaticTest::sayHello;
myStaticUDF();

Treating Java Methods as Objects

In BoxLang, Java methods (both instance and static) are objects you can pass around, invoke, and use in higher-order functions. When you reference a method on a Java class without parentheses, you get a special Function instance. This lets you treat the method like any other function.

Try BoxLang

Static Method Reference Example

Capture the static valueOf() method from the Java String class and invoke it:


import java:java.lang.String;
javaStaticMethod = java.lang.String::valueOf;
result = javaStaticMethod("test"); // New string of "test"

Instance Method Reference Example

Capture the toUpperCase method from a String instance:


javaInstanceMethod = "my string".toUpperCase;
result = javaInstanceMethod(); // "MY STRING"

Using Java Methods with Higher-Order Functions

BoxLang lets you use Java methods directly in place of UDFs or closures for higher-order functions. For example, sort an array in reverse order using Java’s Collections.reverseOrder().compare method:


import java.util.Collections;
[1, 7, 3, 99, 0].sort(Collections.reverseOrder().compare); // [99, 7, 3, 1, 0]

Limitations and Considerations

There are some limitations. Many Java methods can’t be used with CF/BL’s reduceeachmap higher-order built-in functions (BIFs) because they strictly enforce the number of arguments. For example:


import java:java.lang.Math;
[1, 2.4, 3.9, 4.5].map(Math::floor); // Error because floor only accepts a single arg!

The Math.floor() method accepts a single argument, but arrayMap() passes three arguments, causing an error.

Two-Way Compatibility with Java

BoxLang’s ability to pass closures into Java methods that accept functional interfaces or lambdas enhances two-way compatibility between Java and BoxLang. Check out this example of using a Java Stream with a BoxLang lambda:


fruits = ["apple", "banana", "cherry", "ananas", "elderberry"];
result = fruits.stream()
  .filter(fruit -> fruit.startsWith("a"))
  .toList();

Here, we convert a BoxLang array into a Java Stream, use the Java filter() method with a BoxLang lambda, and collect the results into a list.

Conclusion

With BoxLang’s new support for Java method references and higher-order functions, Java interop just got a whole lot cooler. This feature lets you write cleaner, more powerful code by leveraging Java’s capabilities within BoxLang’s modern syntax. Give it a try and see how it can boost your development experience!

Try BoxLang

Add Your Comment

Recent Entries

BoxLang 1.0.0 Beta 7 Launched

BoxLang 1.0.0 Beta 7 Launched

We are pleased to announce the release of BoxLang 1.0.0-Beta 7! This latest beta version includes improvements and essential bug fixes, but more importantly it certifies the execution of ColdBox HMVC and TestBox.

What is BoxLang?

BoxLang is a modern dynamic JVM language that can be deployed on multiple runtimes: operating system (Windows/Mac/*nix/Embedded), web server, lambda, iOS, android, web assembly, and more. BoxLang combines many features from different progr

Luis Majano
Luis Majano
July 26, 2024
Level Up Your ColdFusion Skills with our Virtual Live Training: ColdBox from Zero to Hero

Level Up Your ColdFusion Skills with our Virtual Live Training: ColdBox from Zero to Hero

Level Up Your ColdFusion Skills with our Virtual Live Training: ColdBox from Zero to Hero

Are you a CFML developer looking to take your skills to the next level? Look no further than the ColdBox from Zero to Hero Virtual Live Training! This intensive two-day course will equip you with the knowledge and expertise to build robust and scalable applications using ColdBox 7, the latest version of the most popular CFML MVC framework.

What You'll Learn:

  • Master the Fun...

Cristobal Escobar
Cristobal Escobar
July 24, 2024
Effortless Deployment: Launching Your BoxLang Miniserver!

Effortless Deployment: Launching Your BoxLang Miniserver!

Deploying a BoxLang mini-server website to Render.com can be straightforward and efficient when using a Docker image built with GitHub Actions. This Guest blog post is presented to you by one of our amazing community members Daniel Mejía, who will guide you through the process, detailing each step to ensure a smooth deployment.

Maria Jose Herrera
Maria Jose Herrera
July 23, 2024