Преобразование лямбда-функции со ссылкой на функцию в Java 7

Я работаю над приложением, которое работает на Java 1.7. Мне нужно переписать некоторый код, который был написан на Java 1.8 с SpringFramework. К сожалению, я не знаком с более новой версией и не знаю, как переписать этот код для работы с Java 7...

Ниже часть кода.

ConfigRepo:

public class ConfigRepo extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration repoRestConfig) {
    repoRestConfig.withEntityLookup().forRepository(IConfigRepo.class, (Config config) -> {
        ConfigPK pk = new ConfigPK();
        pk.setScope(config.getId().getScope());
        pk.setKey(config.getId().getKey());
        return pk;
    }, IConfigRepo::findOne);
}

IConfigRepo:

public interface IConfigRepo extends CrudRepository<Config, ConfigPK> {}

РЕДАКТИРОВАТЬ: добавил мой код.

Я не уверен, правильно ли я это сделал. Я не знаю, как этот конфиг конфигурации должен быть передан. Также я не знаю, что я должен делать с этим методом ссылки...

Моя версия:

public class ConfigRepo extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration repoRestConfig) {
    repoRestConfig.withEntityLookup().forRepository(IConfigRepo.class, new Config() {
        public ConfigPK prepareConfigPK(Config config) {
            ConfigPK pk = new ConfigPK();
            pk.setScope(config.getId().getScope());
            pk.setKey(config.getId().getKey());
            return pk;
        }, IConfigRepo::findOne);
}

1 ответ

Решение

Функция forRepository кажется, принимает три аргумента:

  1. Class<IConfigRepo>
  2. Экземпляр интерфейса Converter<Config, ConfigPK>:

    public interface Converter<Config, ConfigPK> {
        ConfigPK convert(Config config);
    }
    

    На самом деле это общий интерфейс, но я вставил типы, которые вы там используете.

  3. Экземпляр другого функционального интерфейса Lookup<IConfigRepo, ID>

    public interface Lookup {
        Object lookup(IConfigRepo repository, ID identifier)
    }
    

    Опять общий интерфейс, но я вставил используемые вами типы (кроме ID).

Таким образом, оба аргумента функционального интерфейса могут быть переписаны как экземпляры анонимных классов:

// Java 8
(Config config) -> {
    ConfigPK pk = new ConfigPK();
    pk.setScope(config.getId().getScope());
    pk.setKey(config.getId().getKey());
    return pk;
}

//Java 7
new Converter<Config, ConfigPK>() {
    @Override
    public ConfigPK convert(Config config) {
        ConfigPK pk = new ConfigPK();
        pk.setScope(config.getId().getScope());
        pk.setKey(config.getId().getKey());
        return pk;
    }
}

а также

// Java 8
IConfigRepo::findOne


// Java 7
// ??? because I don't know your type for ID
new Lookup<IConfigRepo, ???>() {
     @Override
     public Object lookup(IConfigRepo repository, ??? identifier) {
          return repo.findOne();
     }
}

В своем коде вы можете заменить лямбду и ссылку на метод в стиле Java8 как параметры на то, что я там написал

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