問題
我們有多個具有 some 的列舉型別,public static EnumType valueOfText(String text)目的是將資料檔案單元格的內容映射到列舉。
我正在嘗試撰寫一個通用的列舉實用程式,它采用逗號分隔的字串并回傳多個列舉值。例如,我們有以下列舉:
public enum Frequency {
SEMI_ANNUAL("S"), MONTHLY("M"), QUARTERLY("Q"), ANNUAL("A")
public final String textValue;
public Frequency(String textValue) {
this.textValue = textValue;
}
public static Frequency valueOfText(String textValue) {
for (Frequency frequency : values()) {
if (frequency.textValue.equals(textValue))
return frequency;
}
return null;
}
}
和"A,S"我們要轉換為的字串[Frequency.ANNUAL, Frequency.SEMI_ANNUAL]。
嘗試的解決方案
我創建了一些EnumUtils這樣的:
import java.util.stream.Collectors
public final class EnumUtils {
public static final String LIST_SEPARATOR = ",";
public static <E extends Enum<E>> List<E> CreateFromText(String text) {
List<String> textList = text.split(this.LIST_SEPARATOR)
return textList.stream()
.map { txt ->
E.valueOfText(txt)
}
.collect(Collectors.toList())
}
}
上述解決方案后會發生什么
我們去使用它,像這樣:
EnumUtils.CreateFromText<Frequency>(row[3])
和 IDE compain,立即,關于<>.
我們如何在此指定列舉型別?
uj5u.com熱心網友回復:
在 Groovy 中,如果傳遞實際值Class而不是僅使用型別引數,則可以執行此操作。
enum Frequency {
SEMI_ANNUAL("S"), MONTHLY("M"), QUARTERLY("Q"), ANNUAL("A")
final String textValue;
Frequency(String textValue) {
this.textValue = textValue;
}
static Frequency valueOfText(String textValue) {
return values().find { it.textValue == textValue }
}
}
final class EnumUtils {
static <E extends Enum<E>> List<E> createFromText(Class<E> clazz, String text) {
return text.split(",").collect { clazz.valueOfText(it) }
}
}
EnumUtils.createFromText(Frequency, "S,M")
同樣的想法在 Java 中不起作用,因為在編譯時clazz不會valueOfText。
不過,也許 Util 類不會為您節省太多輸入:
"S,M".split(",").collect(Frequency.&valueOfText)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318711.html
