Java LongSupplier Interface

Complete Java LongSupplier interface tutorial covering all methods with examples. Learn about functional programming in Java.

Java LongSupplier Interface

Java LongSupplier Interface

Last modified: April 16, 2025

The java.util.function.LongSupplier interface represents a supplier of long-valued results. It is a functional interface with a single abstract method getAsLong. LongSupplier doesn’t accept any arguments but produces a long value.

LongSupplier is part of Java’s functional programming utilities added in Java 8. It’s useful when you need to generate or supply long values without input parameters. This interface is the primitive specialization of Supplier for long values.

LongSupplier Interface Overview

LongSupplier interface contains one abstract method that must be implemented. The interface is annotated with @FunctionalInterface to indicate its single abstract method nature.

@FunctionalInterface public interface LongSupplier { long getAsLong(); }

The code above shows the simple structure of LongSupplier. It has no default or static methods, just the single abstract method getAsLong that returns a primitive long value.

Basic LongSupplier Usage

The simplest way to use LongSupplier is with lambda expressions. We define how to generate the long value in the getAsLong method. The example shows random number generation.

Main.java

package com.zetcode;

import java.util.function.LongSupplier;

public class Main {

public static void main(String[] args) {

    // Define a LongSupplier that returns random numbers
    LongSupplier randomSupplier = () -> (long) (Math.random() * 1000);
    
    // Get and print several random values
    System.out.println("Random 1: " + randomSupplier.getAsLong());
    System.out.println("Random 2: " + randomSupplier.getAsLong());
    System.out.println("Random 3: " + randomSupplier.getAsLong());
}

}

This example demonstrates basic LongSupplier usage with a lambda expression. The randomSupplier generates random numbers between 0 and 1000. Each call to getAsLong produces a new random value.

LongSupplier with Method Reference

Method references provide a concise way to implement LongSupplier when an existing method matches the interface’s signature. This example uses System.currentTimeMillis.

Main.java

package com.zetcode;

import java.util.function.LongSupplier;

public class Main {

public static void main(String[] args) {

    // LongSupplier using method reference
    LongSupplier timeSupplier = System::currentTimeMillis;
    
    System.out.println("Current time: " + timeSupplier.getAsLong());
    
    // Wait a moment
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    
    System.out.println("Time after delay: " + timeSupplier.getAsLong());
}

}

This example shows LongSupplier implemented with a method reference. The timeSupplier returns the current time in milliseconds. Method references are often cleaner than equivalent lambda expressions.

Stateful LongSupplier

LongSupplier implementations can maintain state between calls. This example creates a counter that increments with each call to getAsLong.

Main.java

package com.zetcode;

import java.util.function.LongSupplier;

public class Main {

public static void main(String[] args) {

    // Stateful LongSupplier
    LongSupplier counter = new LongSupplier() {
        private long count = 0;
        
        @Override
        public long getAsLong() {
            return ++count;
        }
    };
    
    System.out.println("Count 1: " + counter.getAsLong());
    System.out.println("Count 2: " + counter.getAsLong());
    System.out.println("Count 3: " + counter.getAsLong());
}

}

This example demonstrates a stateful LongSupplier. The counter maintains internal state (count) that persists between calls. Each getAsLong call returns and increments the counter. Anonymous class syntax is used here.

LongSupplier in Stream Generation

LongSupplier is useful with Stream.generate to create infinite streams of long values. This example generates a stream of Fibonacci numbers.

Main.java

package com.zetcode;

import java.util.function.LongSupplier; import java.util.stream.LongStream;

public class Main {

public static void main(String[] args) {

    // Fibonacci sequence generator
    LongSupplier fibSupplier = new LongSupplier() {
        private long previous = 0;
        private long current = 1;
        
        @Override
        public long getAsLong() {
            long next = previous + current;
            previous = current;
            current = next;
            return previous;
        }
    };
    
    // Generate first 10 Fibonacci numbers
    LongStream.generate(fibSupplier)
        .limit(10)
        .forEach(System.out::println);
}

}

This example shows LongSupplier used with LongStream.generate. The fibSupplier generates Fibonacci numbers. The stream is limited to 10 elements and printed. State is maintained between stream operations.

Combining LongSuppliers

While LongSupplier doesn’t have composition methods, we can combine them manually to create more complex suppliers. This example averages two other suppliers.

Main.java

package com.zetcode;

import java.util.function.LongSupplier;

public class Main {

public static void main(String[] args) {

    // First supplier - system time modulo 1000
    LongSupplier timeSupplier = () -> System.currentTimeMillis() % 1000;
    
    // Second supplier - random numbers
    LongSupplier randomSupplier = () -> (long) (Math.random() * 1000);
    
    // Combined supplier - average of the two
    LongSupplier averageSupplier = () -> 
        (timeSupplier.getAsLong() + randomSupplier.getAsLong()) / 2;
    
    System.out.println("Average 1: " + averageSupplier.getAsLong());
    System.out.println("Average 2: " + averageSupplier.getAsLong());
}

}

This example demonstrates combining multiple LongSuppliers. The averageSupplier returns the average of values from timeSupplier and randomSupplier. This pattern allows building complex suppliers from simpler ones.

LongSupplier for Constant Values

LongSupplier can be used to supply constant values, though this is more idiomatic with lambda than with method reference. Here we supply a constant.

Main.java

package com.zetcode;

import java.util.function.LongSupplier;

public class Main {

public static void main(String[] args) {

    // Constant value supplier
    LongSupplier constantSupplier = () -> 42L;
    
    System.out.println("The answer: " + constantSupplier.getAsLong());
    
    // Another approach using lambda
    LongSupplier maxValueSupplier = () -> Long.MAX_VALUE;
    System.out.println("Max long: " + maxValueSupplier.getAsLong());
}

}

This example shows LongSupplier returning constant values. While simple, this can be useful when an API expects a LongSupplier but you want to provide a fixed value. The L suffix denotes long literals in Java.

LongSupplier in Optional

LongSupplier is used with OptionalLong’s orElseGet method to provide a fallback value when the Optional is empty. This shows practical usage.

Main.java

package com.zetcode;

import java.util.OptionalLong; import java.util.function.LongSupplier;

public class Main {

public static void main(String[] args) {

    // Empty OptionalLong
    OptionalLong emptyOpt = OptionalLong.empty();
    
    // Supplier for default value
    LongSupplier defaultSupplier = () -> {
        System.out.println("Providing default value");
        return 100L;
    };
    
    // Get value or default from supplier
    long value1 = emptyOpt.orElseGet(defaultSupplier);
    System.out.println("Value 1: " + value1);
    
    // Non-empty Optional
    OptionalLong presentOpt = OptionalLong.of(200L);
    long value2 = presentOpt.orElseGet(defaultSupplier);
    System.out.println("Value 2: " + value2);
}

}

This example demonstrates LongSupplier used with OptionalLong. The defaultSupplier provides a fallback value when the Optional is empty. The supplier is only invoked when needed, making it efficient for expensive operations.

Source

Java LongSupplier Interface Documentation

In this article, we’ve covered the essential features and usage patterns of the Java LongSupplier interface. Understanding these concepts helps with functional programming and stream processing in Java applications.

Author

My name is Jan Bodnar, and I am a dedicated programmer with many years of experience in the field. I began writing programming articles in 2007 and have since authored over 1,400 articles and eight e-books. With more than eight years of teaching experience, I am committed to sharing my knowledge and helping others master programming concepts.

List all Java tutorials.

ad ad