2017-10-20 43 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