簡體   English   中英

編寫將枚舉和字符串作為 arguments 的通用方法

[英]Write generic method which takes enum and string as arguments

請建議。 假設我有兩個枚舉,如下所示。 如果枚舉值與我的字符串匹配,我正在執行任務。

public enum Action {
        DO("DO"),
        REDO("REDO"),
        ROLLBACK("DONT");

        private String value;

        private Action(String value) {
            this.value = value;
        }

        public String getValue() {
            return this.value;
        }
    }

public enum Days {
        WEEK("WORK"),
        LEAVE("DONT WORK");

        private String value;

        private Days(String value) {
            this.value = value;
        }

        public String getValue() {
            return this.value;
        }
    }

我希望下面的工作對這兩種情況都是通用的:

//any String 
String sp ="do";

        Arrays.stream(Action.values()).forEach(e ->{
            if(e.getValue().equalsIgnoreCase(sp)){
                //System.out.println(sp); Some work to do here

            }
        } );

在這段代碼中,你唯一需要的就是這兩個枚舉:

    Arrays.stream(Action.values()).forEach(e ->{
        if(e.getValue().equalsIgnoreCase(sp)){
            //System.out.println(sp); Some work to do here

        }
    } );

getValue方法。

因此,您可以創建一個具有此方法的接口:

interface HasValue {
    String getValue();
}

使兩個枚舉都實現接口:

public enum Action implements HasValue {
    ...
}

public enum Days implements HasValue {
    ...
}

然后你可以寫一個泛型方法:

public <T extends HasValue> void foo(T[] values, String sp) {
    Arrays.stream(values).forEach(e ->{
        if(e.getValue().equalsIgnoreCase(sp)){
            //System.out.println(sp);

        }
    });
}

你可以這樣稱呼它:

foo(Action.values(), sp);
foo(Days.values(), sp);

該方法實際上不必是通用的。 你可以這樣做:

public void foo(HasValue[] values, String sp) {
    ...
}

如果您無法更改DaysAction ,則可以使用功能接口:

public <T> void foo(T[] values, Function<T, String> getValue, String sp) {
    Arrays.stream(values).forEach(e ->{
        if(getValue.apply(e).equalsIgnoreCase(sp)){
            //System.out.println(sp);

        }
    });
}

// usage:

foo(Action.values(), Action::getValue, sp);
foo(Days.values(), Days::getValue, sp);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM