Java, как хранить геттеры в карте

Я хотел бы назвать динамический геттер по заданному перечислению. Я хочу определить это в статической карте. Но я не уверен, как мой объект будет использовать метод.

У меня есть Color enum и библиотека объектов.

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();
  .....
}

Я хочу иметь карту, поэтому, когда у меня будет новый объект Библиотеки по типу, я назову правильный 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)

Но таким образом это не компилируется. Любые предложения, пожалуйста?

3 ответа

Решение

Похоже, ваш Map должен быть объявлен как:

private static Map<Color, Function<Library,List<String>> colorConsumerMap = new HashMap<>()

так как ваши добытчики возвращаются 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);
    }

Здесь мы используем Java 8 supplier,

Чтобы получить значение от HashMap пожалуйста, используйте код:-

Supplier getMethod  = colorConsumerMap.get(Color.Red);
List<String> values = getMethod.get();

Интерфейс Function имеет два параметра типа: тип ввода (Library в вашем случае) и тип вывода (List<String> в твоем случае). Таким образом, вы должны изменить тип вашей карты на Map<Color, Function<Library, List<String>>,

Однако рассмотрите возможность поместить логику не в карту, а в сами значения enum. Например:

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);
 }

Это имеет то преимущество, что если вы добавите новый цвет позже, вы не сможете забыть обновить карту, потому что компилятор будет жаловаться, если вы этого не сделаете.

Другие вопросы по тегам