I have an enum
with another enum
as a parameter
public enum MyEntity{
Entity1(EntityType.type1,
....
MyEntity(EntityType type){
this.entityType = entityType;
}
}
I want to create a method that return the enum
by type
public MyEntity getEntityTypeInfo(EntityType entityType) {
return lookup.get(entityType);
}
usually I would have written
private static final Map<EntityType, EntityTypeInfo> lookup = new HashMap<>();
static {
for (MyEntity d : MyEntity.values()){
lookup.put(d.getEntityType(), d);
}
}
What is the best practice to write it with java stream?
To use the map() method with enums: Use the Object. keys() method to get an array of the enum's keys. Use the map() method to iterate over the array.
EnumMap is a specialized map implementation that uses only Enum type key. In HashMap, we can use Enum as well as any other object as a key.
Java 8 Stream's map method is intermediate operation and consumes single element forom input Stream and produces single element to output Stream. It simply used to convert Stream of one type to another. Let's see method signature of Stream's map method.
Java Enum and Interface As we have learned, we cannot inherit enum classes in Java. However, enum classes can implement interfaces.
public enum FibreSpeed {
a30M( "30Mb Fibre Connection - Broadband Only", 100 ),
a150M( "150Mb Fibre Connection - Broadband Only", 300 ),
a1G( "1Gb Fibre Connection - Broadband Only", 500 ),
b30M( "30Mb Fibre Connection - Broadband & Phone", 700 ),
b150M( "150Mb Fibre Connection - Broadband & Phone", 900 ),
b1G( "1Gb Fibre Connection - Broadband & Phone", 1000 );
public String speed;
public int weight;
FibreSpeed(String speed, int weight) {
this.speed = speed;
this.weight = weight;
}
public static Map<String, Integer> SPEEDS = Stream.of( values() ).collect( Collectors.toMap( k -> k.speed, v -> v.weight ) );
}
I guess there are some typos in your code (the method should be static in my opinion, your constructor is doing a no-op at the moment), but if I'm following you, you can create a stream from the array of enums and use the toMap
collector, mapping each enum with its EntityType
for the keys, and mapping the instance itself as a value:
private static final Map<EntityType, EntityTypeInfo> lookup =
Arrays.stream(EntityTypeInfo.values())
.collect(Collectors.toMap(EntityTypeInfo::getEntityType, e -> e));
The toMap
collector does not make any guarantee about the map implementation returned (although it's currently a HashMap
), but you can always use the overloaded variant if you need more control, providing a throwing merger as parameter.
You could also use another trick with a static class, and fill the map in the constructor.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With