Fundamentals 5 min read

Using Java 8 Functional Interfaces to Replace if...else Statements

Java 8’s functional interfaces, such as Supplier, Consumer, Runnable, and Function, let developers replace verbose if‑else chains with concise lambda‑based constructs, improving readability by encapsulating conditional logic in custom @FunctionalInterface definitions that handle true/false branches, exceptions, and optional values.

Java Tech Enthusiast
Java Tech Enthusiast
Java Tech Enthusiast
Using Java 8 Functional Interfaces to Replace if...else Statements

In Java development, excessive use of if...else statements can make code hard to read. Java 8 introduces functional interfaces that allow these patterns to be expressed more concisely.

The @FunctionalInterface annotation marks an interface with a single abstract method. Common built‑in functional interfaces include Supplier (no arguments, returns a value), Consumer (accepts a value, returns void), Runnable (no arguments, no return), and Function (accepts a value and returns a result).

Example: a custom interface for throwing an exception.

/**
 * Throw exception interface
 */
@FunctionalInterface
public interface ThrowExceptionFunction {
    void throwMessage(String message);
}

A utility method that returns this interface and throws when a condition is true.

public static ThrowExceptionFunction isTrue(boolean b) {
    return errorMessage -> {
        if (b) {
            throw new RuntimeException(errorMessage);
        }
    };
}

Branch handling with two Runnable s.

@FunctionalInterface
public interface BranchHandle {
    void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);
}
public static BranchHandle isTrueOrFalse(boolean b) {
    return (trueHandle, falseHandle) -> {
        if (b) {
            trueHandle.run();
        } else {
            falseHandle.run();
        }
    };
}

Handling optional values with Consumer and Runnable.

public interface PresentOrElseHandler<T> {
    void presentOrElseHandle(Consumer<? super T> action, Runnable emptyAction);
}
public static PresentOrElseHandler<String> isBlankOrNoBlank(String str) {
    return (consumer, runnable) -> {
        if (str == null || str.length() == 0) {
            runnable.run();
        } else {
            consumer.accept(str);
        }
    };
}

Using these interfaces simplifies conditional logic and improves code readability.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

JavaLambdaFunctional Interface
Java Tech Enthusiast
Written by

Java Tech Enthusiast

Sharing computer programming language knowledge, focusing on Java fundamentals, data structures, related tools, Spring Cloud, IntelliJ IDEA... Book giveaways, red‑packet rewards and other perks await!

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.