3 回答

TA貢獻1803條經驗 獲得超3個贊
我不確定這是因為我以某種方式混淆了語法,還是因為 map 方法有太多重載而無法創建明確的引用。
你沒有弄亂語法;Java 中沒有等效項(它通常比 C# 更冗長,流也不例外。)
當您要傳遞給方法的參數與功能接口中的參數相同且順序相同時,您只能使用方法引用(雙冒號)語法。
在 的情況下map
,只有一個參數,您需要將第二個參數(即Bar.class
)傳遞給modelMapper.map()
,因此不允許使用方法引用語法。您可以使用它的唯一方法是,如果您要將其子類化modelMapper
以Bar
僅使用它,從而消除對第二個顯式類參數的需要。
我非常有信心您在此處使用的方法是 Java 中最簡潔的處理方式。

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 是一個隱藏的(合成的)方法。

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 表達式。
添加回答
舉報