Compile-Time Java Stream Fusion via mapMulti

📅 2026-05-04
📈 Citations: 0
Influential: 0
📄 PDF

career value

183K/year
🤖 AI Summary
This work addresses the performance overhead incurred by intermediate object creation in consecutive map() and filter() operations of the Java Stream API. The authors propose a compile-time optimization technique that transforms such operation chains into a single mapMulti() invocation via bytecode rewriting, thereby eliminating intermediate objects. This approach overcomes limitations of existing tools in handling lambda escape and stream variable assignments, and notably does not rely on loop unrolling. Experimental evaluation shows that the method significantly outperforms Streamliner on 2 out of 9 benchmarks while matching its performance on the rest. Furthermore, it successfully passes all 31,799 unit tests in Apache Kafka, demonstrating both correctness and practical applicability.
📝 Abstract
The Java Stream API, introduced in Java 8, makes data processing more expressive and concise compared to imperative loops. However, this abstraction can come with significant performance overhead, often due to the creation of multiple intermediate objects during pipeline execution. In functional languages such as Haskell, this problem is addressed through stream fusion, a compile-time optimization that eliminates unnecessary intermediate structures. Inspired by this idea, Streamliner was the first tool to perform ahead-of-time, bytecode-to-bytecode stream optimization for Java by unrolling stream pipelines into imperative loops. In this paper, we introduce an open-source optimizer that takes a different approach. Instead of unrolling streams into loops, it merges consecutive map() and filter() operations into a single mapMulti() call, available since Java 16. Our method avoids several limitations of Streamliner, including its sensitivity to escaping objects in lambda expressions and its restrictions on assigning or passing streams as variables. We evaluated our optimizer on nine benchmarks and observed superior performance in two cases and comparable results in most others. We also applied it to the bytecode of Apache Kafka, successfully executing all 31,799 unit tests without failures.
Problem

Research questions and friction points this paper is trying to address.

Java Stream
performance overhead
intermediate objects
stream fusion
compile-time optimization
Innovation

Methods, ideas, or system contributions that make the work stand out.

stream fusion
mapMulti
compile-time optimization
Java Stream API
intermediate object elimination