2017-10-20 48 views
0

我有java的代碼是這樣的:科特林懸而未決參考:從Java代碼轉換之後添加

public static <KEY, VALUE> Map<KEY, List<VALUE>> createMultimap(@NonNull Collection<VALUE> values, @NonNull TransformFunction<VALUE, KEY> transformFunction) { 
    Map<KEY, List<VALUE>> tmpMap = new HashMap<>(); 
    for (VALUE value : values) { 
     if (value != null) { 
      KEY key = transformFunction.transform(value); 
      List<VALUE> valuesList = tmpMap.get(key); 
      if (valuesList == null) { 
       valuesList = new ArrayList<>(); 
       tmpMap.put(key, valuesList); 
      } 
      valuesList.add(value); 
     } 
    } 
    return Collections.unmodifiableMap(tmpMap); 
} 

我把它轉換使用Android Studio的選項「轉換爲科特林」

這裏是什麼樣子:

fun <KEY, VALUE> createMultimap(values: Collection<VALUE>, transformFunction: TransformFunction<VALUE, KEY>): Map<KEY, List<VALUE>> { 
    val tmpMap = HashMap<KEY, List<VALUE>>() 
    for (value in values) { 
     if (value != null) { 
      val key = transformFunction.transform(value) 
      var valuesList: List<VALUE>? = tmpMap[key] 
      if (valuesList == null) { 
       valuesList = ArrayList() 
       tmpMap.put(key, valuesList) 
      } 
      valuesList.add(value) 

     } 
    } 
    return Collections.unmodifiableMap(tmpMap) 
} 

IDE現在強調這裏的 '添加' 方法:

valuesList.add(value) 

它說:

懸而未決參考:添加

我怎樣才能解決這個問題?

UPDATE:

這裏是我的變換函數:

interface TransformFunction<VALUE, RESULT> { 
    fun transform(value: VALUE?): RESULT 
} 

使用範例:

private fun getRSSIMultimap(rssiEvents: Collection<LocationRSSIEvent>): Map<NexoIdentifier, List<LocationRSSIEvent>> { 
    return CollectionsUtils.createMultimap(rssiEvents, object : CollectionsUtils.TransformFunction<LocationRSSIEvent, NexoIdentifier> { 
     override fun transform(locationRSSIEvent: LocationRSSIEvent): NexoIdentifier { 
      return locationRSSIEvent.nexoIdentifier 
     } 
    }) 
} 

回答

1

既然找你指定一個列表<>您ValuesList中它不知道添加( )。

將其更改爲

fun <KEY, VALUE> createMultimap(values: Collection<VALUE>, transformFunction: TransformFunction<VALUE, KEY>): Map<KEY, ArrayList<VALUE>> { 
var valuesList: ArrayList<VALUE>? = tmpMap[key] 

更好地利用Kotlins MutableList這是目前同Java類的ArrayList,但可能在以後的版本中更改爲本地方法。

fun <KEY, VALUE> createMultimap(values: Collection<VALUE>, transformFunction: TransformFunction<VALUE, KEY>): Map<KEY, MutableList<VALUE>> { 
    val tmpMap = HashMap<KEY, MutableList<VALUE>>() 
    for (value in values) { 
     if (value != null) { 
      val key = transformFunction.transform(value) 
      var valuesList: MutableList<VALUE>? = tmpMap[key] 
      if (valuesList == null) { 
       valuesList = mutableListOf() 
       tmpMap.put(key, valuesList) 
      } 
      valuesList.add(value) 

     } 
    } 
    return Collections.unmodifiableMap(tmpMap) 
} 
+0

對不起,但它仍強調'添加'方法。我正在使用Android Studio 3.0。也許你可以檢查它? – Konrad

+0

請添加您的TransformFunction。它可能被高階函數取代。更新了代碼。現在工作。 –

+0

謝謝,我更新了我的問題。您的解決方案可以運作 – Konrad