Java Top

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we'll look briefly at the different ways of casting an int to an enum value in Java. Although there's no direct way of casting, there are a couple of ways to approximate it.

2. Using Enum#values

Firstly, let's look at how we can solve this problem by using the Enum‘s values method.

Let's start by creating an enum PizzaStatus that defines the status of an order for a pizza:

public enum PizzaStatus {
    ORDERED(5),
    READY(2),
    DELIVERED(0);

    private int timeToDelivery;

    PizzaStatus (int timeToDelivery) {
        this.timeToDelivery = timeToDelivery;
    }

    // Method that gets the timeToDelivery variable.
}

We associate each constant enum value with timeToDelivery field. When defining the constant enums, we pass the timeToDelivery field to the constructor.

The static values method returns an array containing all of the values of the enum in the order of their declaration. Therefore, we can use the timeToDelivery integer value to get the corresponding enum value:

int timeToDeliveryForOrderedPizzaStatus = 5;

PizzaStatus pizzaOrderedStatus = null;

for (PizzaStatus pizzaStatus : PizzaStatus.values()) {
    if (pizzaStatus.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) {
        pizzaOrderedStatus = pizzaStatus;
    }
}

assertThat(pizzaOrderedStatus).isEqualTo(PizzaStatus.ORDERED);

Here, we use an array returned by the PizzaStatus.values()  to find a matching value based on the timeToDelivery property.

This approach, however, is quite verbose. Moreover, it's also inefficient as every time we want to fetch the corresponding PizzaStatus, we need to iterate over the PizzaStatus.values().

2.1. Using Java 8 Stream

Let's see how we can find the matching PizzaStatus using the Java 8 approach:

int timeToDeliveryForOrderedPizzaStatus = 5;

Optional<PizzaStatus> pizzaStatus = Arrays.stream(PizzaStatus.values())
  .filter(p -> p.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus)
  .findFirst();

assertThat(pizzaStatus).hasValue(PizzaStatus.ORDERED);

This code looks more concise than the one which uses the for loop. However, still, we iterate over the PizzaStatus.values() every time we need to get a matching enum.

Also, note that in this approach we get the Optional<PizzaStatus> instead of the PizzaStatus instance directly.

3. Using Map

Next, let's use Java's Map data structure along with the values method to fetch the enum value corresponding to the time to deliver integer value.

In this approach, the values method is called only once while initializing the map. Furthermore, since we're using a map, we don't need to iterate over the values each time we need to fetch the enum value corresponding to the time to deliver.

We use a static map timeToDeliveryToEnumValuesMapping internally, which handles the mapping of time to deliver to its corresponding enum value.

Furthermore, the values method of the Enum class provides all the enum values. In the static block, we iterate over the array of enum values and add them to the map along with the corresponding time to deliver integer value as key:

private static Map<Integer, PizzaStatus> timeToDeliveryToEnumValuesMapping = new HashMap<>();

static {
    for (PizzaStatus pizzaStatus : PizzaStatus.values()) {
        timeToDeliveryToEnumValuesMapping.put(
          pizzaStatus.getTimeToDelivery(),
          pizzaStatus
        );
    }
}

Finally, we create a static method that takes the timeToDelivery integer as a parameter. This method returns the corresponding enum value using the static map timeToDeliveryToEnumValuesMapping:

public static PizzaStatus castIntToEnum(int timeToDelivery) {
    return timeToDeliveryToEnumValuesMapping.get(timeToDelivery);
}

By using a static map and static method, we fetch the enum value corresponding to the time to deliver integer value.

4. Conclusion

In conclusion, we looked at a couple of workarounds to fetch enum values corresponding to the integer value.

As always, all these code samples are available over on GitHub.

Java bottom

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE
4 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Alex Andrade
Alex Andrade
24 days ago

“Using Map” code example is very hard to read, you can refactor it just to:
 

static {
    for (var p : PizzaStatus.values()) {
        timeToDeliveryToEnumValuesMapping.put(
            p.getTimeToDelivery(), 
            p);
    }
}
Loredana Crusoveanu
14 days ago
Reply to  Alex Andrade

Hi Alex,
Thanks for the feedback. We’ll update the code examples.
Cheers

Giuseppe Berardi
Giuseppe Berardi
17 days ago

Another elegant way to perform the convertion from int to enum in java is by using the stream:
 
public static final Optional<PizzaStatus> fromTimeToDelivery(final int timeToDelivery) {

final List<PizzaStatus> pizzaStatusList = Arrays.asList(PizzaStatus.values());

return pizzaStatusList.stream().filter(pizzaStatus-> pizzaStatus.timeToDelivery == timeToDelivery).findAny();                
        

}

Loredana Crusoveanu
14 days ago

Hi Giuseppe,
Yeah, that’s a good idea. We’ll update the article. Thanks!

Comments are closed on this article!