亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在沒有 Lambda 表達式的情況下對流進行模型映射

在沒有 Lambda 表達式的情況下對流進行模型映射

三國紛爭 2023-03-31 09:57:33
我不是 Java 開發人員,但我有多年的 C# 經驗。我有一個List<Foo>,我需要轉換為一個List<Bar>using ModelMapperwhereFoo并且Bar具有基本相同的屬性。目前我把它寫成:@AutoWired ModelMapper modelMapper;...List<Bar> results = repository        .getFoos()        .stream()        .map(x -> modelMapper.map(x, Bar.class))        .collect(Collectors.toList());這很好用。但是,我覺得 lambda 表達式可以只用一個簡單的方法引用來代替。如果這是 C#,我可能可以按照以下方式做一些事情:var results = repository.getFoos().Select(modelMapper.map<Bar>).ToList();但是我在 Java 中找不到正確的語法。我試過這個:.map(modelMapper::<Bar>map)但我得到錯誤:無法解析方法“ map”我不確定這是因為我以某種方式混淆了語法,還是因為 map 方法有太多重載而無法創建明確的引用。如果有幫助,map我嘗試使用的重載定義為:public <D> D map(Object source, Class<D> destinationType)沒有 lambda 表達式,有什么方法可以實現此映射?
查看完整描述

3 回答

?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

我不確定這是因為我以某種方式混淆了語法,還是因為 map 方法有太多重載而無法創建明確的引用。

你沒有弄亂語法;Java 中沒有等效項(它通常比 C# 更冗長,流也不例外。)

當您要傳遞給方法的參數與功能接口中的參數相同且順序相同時,您只能使用方法引用(雙冒號)語法。

在 的情況下map,只有一個參數,您需要將第二個參數(即Bar.class)傳遞給modelMapper.map(),因此不允許使用方法引用語法。您可以使用它的唯一方法是,如果您要將其子類化modelMapperBar僅使用它,從而消除對第二個顯式類參數的需要。

我非常有信心您在此處使用的方法是 Java 中最簡潔的處理方式。


查看完整回答
反對 回復 2023-03-31
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

Java 不支持部分函數應用(與柯里化相關),因此您只能使用 lambda 來做到這一點。

當然,由于您不引用任何局部變量或參數,您可以定義一個方法,然后再引用它。

@AutoWired ModelMapper modelMapper;


private Bar mapToBar(Foo x) {

? ? return modelMapper.map(x, Bar.class);

}


...


List<Bar> results = repository

? ? ? ? .getFoos()

? ? ? ? .stream()

? ? ? ? .map(this::mapToBar)

? ? ? ? .collect(Collectors.toList());

這實際上非常接近 lambda 的編譯方式,除了mapToBarlambda 是一個隱藏的(合成的)方法。


查看完整回答
反對 回復 2023-03-31
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

實際上這是做不到的,因為你的modelMapper.map()方法需要兩個參數。如果此時你真的想使用方法引用,你可以在你的 中創建一個新方法modelMapper,它只需要一個參數或將調用包裝modelMapper.map()在另一個方法中,如下所示:

private Bar mapFooToBar(Foo x) { 
   return modelMapper.map(x, Bar.class);
}

您現在可以將此方法與方法參考一起使用:

List<Bar> results = repository.getFoos().stream()
        .map(this::mapFooToBar)
        .collect(Collectors.toList());

但最后我認為這不會使您的代碼以任何方式變得更好,所以我建議使用您已有的 lambda 表達式。


查看完整回答
反對 回復 2023-03-31
  • 3 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號