Java 如何在地图中存储吸气剂
Java how to store getters in map
我想通过给定枚举调用动态 getter。我想在静态地图中定义它。但是我不确定我的对象将如何使用该方法。
我有颜色枚举和对象库。
public enum Color {
Red,
Blue,
Black,
Green,
Pink,
Purple,
White;
}
public class Library{
public List<String> getRed();
public List<String> getBlue();
public List<String> getBlack();
.....
}
我想要一个地图,所以当我有一个新的 Library 对象时,我将调用正确的 get。
例如:
private static Map<Color, Function<......>, Consumer<....>> colorConsumerMap = new HashMap<>();
static {
colorConsumerMap.put(Color.Red, Library::getRed);
colorConsumerMap.put(Color.Blue, Library::getBlue);
}
Library lib = new Library();
List<String> redList = colorConsumerMap.get(Color.Red).apply(lib)
但是这种方式无法编译。
有什么建议吗?
您的 Map
看起来应该声明为:
private static Map<Color, Function<Library,List<String>> colorConsumerMap = new HashMap<>()
因为你的 getters return List<String>
.
您好,请找到以下供应商代码:-
enum Color {
Red,
Blue,
Black,
Green,
Pink,
Purple,
White;
}
class Library{
public Supplier supplier;
public List<String> getRed(){}; // implement according to need
public List<String> getBlue(){}; // implement according to need
public List<String> getBlack(){}; // implement according to need
private Map<Color, Supplier<List<String>>> colorConsumerMap = new HashMap<Color, Supplier<List<String>>>();
static {
colorConsumerMap.put(Color.Red, Library::getRed);
colorConsumerMap.put(Color.Blue, Library::getBlue);
}
这里我们使用的是java8supplier
.
要从 HashMap
中获取值,请使用代码:-
Supplier getMethod = colorConsumerMap.get(Color.Red);
List<String> values = getMethod.get();
Function 接口有两个类型参数:输入类型(在您的情况下为Library
)和输出类型(在您的情况下为List<String>
)。因此,您必须将地图类型更改为 Map<Color, Function<Library, List<String>>
.
但是,考虑将逻辑不放在映射中,而是放在枚举值本身中。例如:
public enum Color {
Red(Library::getRed),
Blue(Library::getBlue);
private Function<Library, List<String>> getter;
private Color(Function<Library, List<String>> getter) {
this.getter = getter;
}
public List<String> getFrom(Library library) {
return getter.apply(library);
}
}
public class Library{
public List<String> getRed() { return Collections.singletonList("Red"); }
public List<String> getBlue() { return Collections.singletonList("Blue"); }
}
Library lib = new Library();
System.out.println(Color.Red.getFrom(lib));
System.out.println(Color.Blue.getFrom(lib));
或者如果您不想使用 Java 8 个功能:
public enum Color {
Red {
List<String> getFrom(Library library) {
return library.getRed();
}
},
Blue {
List<String> getFrom(Library library) {
return library.getBlue();
}
};
abstract List<String> getFrom(Library library);
}
这样做的好处是,如果您以后添加新颜色,就不会忘记更新贴图,因为如果您不这样做,编译器会报错。
我想通过给定枚举调用动态 getter。我想在静态地图中定义它。但是我不确定我的对象将如何使用该方法。
我有颜色枚举和对象库。
public enum Color {
Red,
Blue,
Black,
Green,
Pink,
Purple,
White;
}
public class Library{
public List<String> getRed();
public List<String> getBlue();
public List<String> getBlack();
.....
}
我想要一个地图,所以当我有一个新的 Library 对象时,我将调用正确的 get。 例如:
private static Map<Color, Function<......>, Consumer<....>> colorConsumerMap = new HashMap<>();
static {
colorConsumerMap.put(Color.Red, Library::getRed);
colorConsumerMap.put(Color.Blue, Library::getBlue);
}
Library lib = new Library();
List<String> redList = colorConsumerMap.get(Color.Red).apply(lib)
但是这种方式无法编译。 有什么建议吗?
您的 Map
看起来应该声明为:
private static Map<Color, Function<Library,List<String>> colorConsumerMap = new HashMap<>()
因为你的 getters return List<String>
.
您好,请找到以下供应商代码:-
enum Color {
Red,
Blue,
Black,
Green,
Pink,
Purple,
White;
}
class Library{
public Supplier supplier;
public List<String> getRed(){}; // implement according to need
public List<String> getBlue(){}; // implement according to need
public List<String> getBlack(){}; // implement according to need
private Map<Color, Supplier<List<String>>> colorConsumerMap = new HashMap<Color, Supplier<List<String>>>();
static {
colorConsumerMap.put(Color.Red, Library::getRed);
colorConsumerMap.put(Color.Blue, Library::getBlue);
}
这里我们使用的是java8supplier
.
要从 HashMap
中获取值,请使用代码:-
Supplier getMethod = colorConsumerMap.get(Color.Red);
List<String> values = getMethod.get();
Function 接口有两个类型参数:输入类型(在您的情况下为Library
)和输出类型(在您的情况下为List<String>
)。因此,您必须将地图类型更改为 Map<Color, Function<Library, List<String>>
.
但是,考虑将逻辑不放在映射中,而是放在枚举值本身中。例如:
public enum Color {
Red(Library::getRed),
Blue(Library::getBlue);
private Function<Library, List<String>> getter;
private Color(Function<Library, List<String>> getter) {
this.getter = getter;
}
public List<String> getFrom(Library library) {
return getter.apply(library);
}
}
public class Library{
public List<String> getRed() { return Collections.singletonList("Red"); }
public List<String> getBlue() { return Collections.singletonList("Blue"); }
}
Library lib = new Library();
System.out.println(Color.Red.getFrom(lib));
System.out.println(Color.Blue.getFrom(lib));
或者如果您不想使用 Java 8 个功能:
public enum Color {
Red {
List<String> getFrom(Library library) {
return library.getRed();
}
},
Blue {
List<String> getFrom(Library library) {
return library.getBlue();
}
};
abstract List<String> getFrom(Library library);
}
这样做的好处是,如果您以后添加新颜色,就不会忘记更新贴图,因为如果您不这样做,编译器会报错。