eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (cat=Spring Boot)
announcement - icon

Refactor Java code safely — and automatically — with OpenRewrite.

Refactoring big codebases by hand is slow, risky, and easy to put off. That’s where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.

Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions — one for newcomers and one for experienced users. You’ll see how recipes work, how to apply them across projects, and how to modernize code with confidence.

Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.

Course – LJB – NPI EA (cat = Core Java)
announcement - icon

Code your way through and build up a solid, practical foundation of Java:

>> Learn Java Basics

Partner – LambdaTest – NPI EA (cat= Testing)
announcement - icon

Distributed systems often come with complex challenges such as service-to-service communication, state management, asynchronous messaging, security, and more.

Dapr (Distributed Application Runtime) provides a set of APIs and building blocks to address these challenges, abstracting away infrastructure so we can focus on business logic.

In this tutorial, we'll focus on Dapr's pub/sub API for message brokering. Using its Spring Boot integration, we'll simplify the creation of a loosely coupled, portable, and easily testable pub/sub messaging system:

>> Flexible Pub/Sub Messaging With Spring Boot and Dapr

1. Introduction

In this tutorial, we’ll explore how to sort Long values using the Collections.sort() method. Java provides a simple way to sort lists, but when dealing with Long values, we need to understand how Java compares objects.

2. Understanding Natural Ordering for Long Values

The Collections.sort() method sorts elements in their natural order by default. For numerical types like Long, natural ordering arranges values from smallest to largest. This works seamlessly because the Long class implements the Comparable interface, which defines the intrinsic sorting behavior.

For example, when comparing 500L and 200L using the compareTo() method:

Long a = 500L;
Long b = 200L;
int result = a.compareTo(b);

// result > 0 because 500 > 200

This natural ordering is used by default in methods like Collections.sort() when no explicit comparator is provided. Let’s look at an example that compares Long values based on their natural ordering:

List<Long> numbers = new ArrayList<>(Arrays.asList(500L, 200L, 800L));
Collections.sort(numbers);

assertEquals(Arrays.asList(200L, 500L, 800L), numbers);

When Collections.sort() is called, Java internally uses the compareTo() method to compare the elements. The compareTo() method for Long works as follows:

  • If a < b, it returns a negative number
  • If a == b, it returns zero
  • If a > b, it returns a positive number.

This approach is straightforward and ideal for most use cases where ascending order is required, such as arranging transaction amounts or sorting timestamps in chronological order.

3. Comparing Long Values in Descending Order Using a Comparator

If we want to reverse the natural comparison order, we can use Comparator.reverseOrder(), which compares the Long values in descending order. This provides an alternative to modifying the underlying comparison logic directly.

Let’s see how to compare Long values in descending order:

Collections.sort(numbers, Comparator.reverseOrder());

assertEquals(Arrays.asList(800L, 500L, 200L), numbers);

The Comparator.reverseOrder() comparator reverses the natural comparison, ensuring that the Long values are compared in descending order without needing to manually implement a comparator.

4. Creating Custom Comparing Logic with a Comparator

Beyond simple ascending or descending comparisons, we can also create a custom Comparator if we need more control over sorting. For instance, arranging values in descending order or prioritizing certain numbers (for example, even numbers first) demands custom logic.

Java’s Comparator interface allows us to define these rules explicitly. A Comparator acts as a blueprint for comparing two elements, enabling flexible sorting strategies beyond natural ordering.

Suppose we want to compare Long values based on their distance from a target value, such as 400L. Let’s create a custom Comparator for this requirement:

List<Long> numbers = new ArrayList<>(Arrays.asList(500L, 200L, 800L));
long target = 400L;

Collections.sort(numbers, (a, b) -> {
    long distanceA = Math.abs(a - target);
    long distanceB = Math.abs(b - target);
    return Long.compare(distanceA, distanceB);
});

assertEquals(Arrays.asList(500L, 200L, 800L), numbers);

In this example, the comparison logic is based on the distance of each Long value from our target value of 400L. The comparator calculates the absolute difference between each Long value and the target and then compares these distances.

5. Comparing Long Values with Multiple Criteria

In some scenarios, we may want to compare Long values based on multiple criteria. For example, we may want to sort Long values by their absolute value or by other business rules. This can be accomplished using multiple comparator conditions.

Let’s consider a scenario where we need to first sort by the absolute value and, in the case of ties, by the original value. This can be done by chaining comparators:

List<Long> numbers = new ArrayList<>(Arrays.asList(-500L, 200L, -800L, 300L));
Collections.sort(numbers, Comparator.comparingLong(n -> Math.abs((Long) n))
  .thenComparingLong(n -> (Long) n));

assertEquals(Arrays.asList(200L, 300L, -500L, -800L), numbers);

The thenComparing() method is used to add a secondary comparison criterion. In this case, the Long values are first compared by absolute value using Comparator.comparingLong(Math::abs). If two values have the same absolute value, the original values are compared to break the tie using thenComparingLong(Long::longValue).

This approach is particularly useful when there are multiple sorting rules, such as sorting by value and then by timestamp or name.

6. Handling Null Values in Long Comparisons

The Collections.sort() method does not allow nulls by default and will throw a NullPointerException if any null values are present. To handle this, we can use a custom comparator to define how null values should be treated during the comparison process.

We can use Comparator.nullsFirst() to ensure that nulls are placed at the start of the sorted list:

List<Long> numbers = new ArrayList<>(Arrays.asList(500L, null, 200L, 800L));
Collections.sort(numbers, Comparator.nullsFirst(Comparator.naturalOrder()));

assertEquals(Arrays.asList(null, 200L, 500L, 800L), numbers);

Alternatively, we can use Comparator.nullsLast() to position null values at the end of the list:

Collections.sort(numbers, Comparator.nullsLast(Comparator.naturalOrder()));

assertEquals(Arrays.asList(200L, 500L, 800L, null), numbers);

7. Comparing Long Values Based on Custom Object Properties

In many cases, Long values are part of custom objects, and we may need to sort these objects based on the value of a property. For instance, let’s assume we have a Transaction class with a Long field for the transaction amount. We can use a comparator to sort these objects based on the Long value.

Here’s an example:

class Transaction {
    private Long amount;

    public Transaction(Long amount) {
        this.amount = amount;
    }

    public Long getAmount() {
        return amount;
    }
}

List<Transaction> transactions = new ArrayList<>();
transactions.add(new Transaction(500L));
transactions.add(new Transaction(200L));
transactions.add(new Transaction(800L));

// Sorting transactions by amount
Collections.sort(transactions, Comparator.comparingLong(Transaction::getAmount));

assertEquals(Arrays.asList(200L, 500L, 800L), transactions.stream().map(Transaction::getAmount).collect(Collectors.toList()));

This code sorts a list of Transaction objects based on their amount field using the Comparator.comparingLong() method. This approach is useful when the Long value is wrapped in a custom object.

8. Conclusion

In this article, we’ve explored various ways to compare Long values using Java’s Collections.sort() method. We discussed natural ordering, custom comparators, handling null values, and comparing based on multiple criteria. These techniques allow us to define precise comparison logic for Long values, whether working with simple lists or custom objects.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (tag=Refactoring)
announcement - icon

Modern Java teams move fast — but codebases don’t always keep up. Frameworks change, dependencies drift, and tech debt builds until it starts to drag on delivery. OpenRewrite was built to fix that: an open-source refactoring engine that automates repetitive code changes while keeping developer intent intact.

The monthly training series, led by the creators and maintainers of OpenRewrite at Moderne, walks through real-world migrations and modernization patterns. Whether you’re new to recipes or ready to write your own, you’ll learn practical ways to refactor safely and at scale.

If you’ve ever wished refactoring felt as natural — and as fast — as writing code, this is a good place to start.

eBook Jackson – NPI EA – 3 (cat = Jackson)