मैं एक विधि बनाना चाहता हूं, जो इसके मूल्य से एनम स्थिरांक लौटाता है।

मेरे पास कई एनम वर्ग हैं जो इस तरह दिखते हैं (उनमें से कुछ में अलग-अलग नामों के साथ गेटर चर हैं):

@AllArgsConstructor
public enum PhoneType {

MOBILE("Mobile", 3),
HOME("Home", 6),
WORK("Work", 7);

@Getter
String type;

@Getter
int id;
}

मैंने इस धारा का उपयोग एनम स्थिरांक प्राप्त करने के लिए किया था:

int phoneTypeId = 3;

PhoneType phoneType = Arrays.stream(PhoneType.values())
   .filter(p -> p.getId() == phoneTypeId)
   .findFirst()
   .orElseThrow(() -> new RuntimeException("Not able to find Enum...."));

System.out.println(phoneType.getType());

आउटपुट है: "मोबाइल"

अब मैं एक ऐसी विधि बनाना चाहता हूं जो विभिन्न एनम कक्षाओं के लिए काम करेगी। मैंने कुछ इस तरह से शुरू किया, लेकिन मुझे नहीं पता कि फ़िल्टर लाइन को फिर से कैसे लिखना है, इसे किसी भी एनम क्लास के लिए काम करने के लिए। इस विधि के इनपुट पैरामीटर के रूप में इस "p -> p.getId() == phoneTypeId" को पास करना आदर्श होगा। कोई विचार?

public static <E extends Enum<?>> E getEnumByValue(Class<E> enumClass) {
    return Arrays.stream(enumClass.getEnumConstants())
            .filter(p -> p.getId() == phoneTypeId)
            .findFirst()
            .orElseThrow(() -> new RuntimeException("Not able to find Enum...."));
}

(मुझे पता है कि ऐसा करना संभव है यदि मैं सभी एनम कक्षाओं के लिए इंटरफ़ेस लागू करता हूं, लेकिन फिर एनम चर के समान नाम होने चाहिए।)

4
Marcus 18 फरवरी 2021, 15:59
मेरे पास हर बार (O(n)) मानों पर पुनरावृति करने के बजाय O(1) में देखने के लिए static Map<Integer, PhoneType> होना चाहिए। ऐसा नक्शा आसानी से सीधे PhoneType FYI: Stream.of(values()).collect(toMap(PhoneType::getId, identity())) के भीतर से शुरू किया जा सकता है।
 – 
sp00m
18 फरवरी 2021, 16:12

1 उत्तर

सबसे बढ़िया उत्तर

आप इसे Predicate के रूप में पास कर सकते हैं :

public static <E extends Enum<?>> Optional<E> getEnumByValue(Class<E> enumClass, Predicate<E> predicate) {
    return Arrays.stream(enumClass.getEnumConstants())
            .filter(predicate)
            .findFirst();
}

(नोट: विधि को वास्तव में एक Optional<E> वापस करना चाहिए)

यदि सभी एनम में आईडी हैं, तो आप अभी भी एक सामान्य इंटरफ़ेस लागू कर सकते हैं:

interface Identifiable {
    int getId();
}

enum PhoneType implements Identifiable {
    ...
}

public static <E extends Enum<?> & Identifiable> Optional<E> getEnumById(Class<E> enumClass, int id) {
    return Arrays.stream(enumClass.getEnumConstants())
            .filter(e -> e.getId() == id)
            .findFirst();
}

Optional<PhoneType> phone = getEnumById(PhoneType.class, phoneTypeId);
5
M A 18 फरवरी 2021, 16:22
धन्यवाद यही वह है जिसे मैं ढूंढ रहा था। (मैं अपवाद फेंक रहा हूं अगर यह वैकल्पिक <ई> लौटने के बजाय नहीं मिला है, तो मैं इन पंक्तियों को कॉपी करना भूल गया ...)
 – 
Marcus
18 फरवरी 2021, 16:28