2017-06-19 87 views
1

我正在研究一個正在使用Java 1.7的應用程序。我需要重寫一些使用SpringFramework的Java 1.8編寫的代碼。不幸的是,我不熟悉新版本,我不知道如何重寫此代碼以使用Java 7 ...使用Java 7中的函數將方法引用轉換爲lambda

下面的代碼部分。

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> {} 

編輯: 增加了我的代碼。

我不確定這是否我做了正確的一部分。我不知道這個Config配置應該如何傳遞。此外,我不知道我應該用這種方法做參考...

我的版本:

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

你的問題是什麼? –

+0

我認爲這很清楚...我正在尋求幫助將此代碼重寫到Java 7,因爲我無法處理這個問題。 – Lui

+1

我意識到你需要幫助,但你在哪裏掙扎?你嘗試了什麼?什麼不行?你的代碼在哪裏? –

回答

2

功能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)類型。

因此,兼具功能性接口參數可以改寫爲匿名類的實例:在你的代碼可以代替Java8風格Lambda和方法參考

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

作爲我寫在那裏的參數

+0

基本上,forRepository方法來自Spring Data REST - [link](http://docs.spring.io/spring-data/rest/docs/current/api/org/springframework/data/rest/core/config/ EntityLookupRegistrar.html#forRepository-java.lang.Class-org.springframework.core.convert.converter.Converter-org.springframework.data.rest.core.config.EntityLookupRegistrar.LookupRegistrar.Lookup-) – Lui

+0

我是否需要更新接口在我的答案,或者你可以做轉移? – danielspaniol

+0

如果你可以這樣做,特別是對於最後一個參數...因爲這個方法的聲明來自CrudRepository接口並且實現在SimpleJpaRepository中。說實話,這對我來說很難... 什麼是「new MethodName()」的那些名稱?對於第二個參數,它應該是新的Config()?而對於第三個參數新的CrudRepository()? – Lui

相關問題