如何将函数作为参数传递给computeIfAbsent方法?

时间:2019-02-18 09:12:43

标签: java lambda java-8 functional-programming hashmap

我是Java新手,有点从C#过渡到Java。 java.util.function具有一个定义为Function的接口,该接口输入到computeIfAbsent的{​​{1}}方法中。

我想定义该函数并将其委托给Map方法。

computeIfAbsent

可行,但是我希望在func回调中使用它。但问题是map.computeIfAbsent(key, k => new SomeObject()) 需要定义输入参数。如何将其设置为Function或不带参数。

void

5 个答案:

答案 0 :(得分:7)

computeIfAbsent将始终具有用于传递的Function的输入参数-这将是关键。

因此,正如您所写:

map.computeIfAbsent(key, k -> new SomeObject());

您也可以写(假设您的Map的键是String

Function<String,SomeObject> func = k -> new SomeObject();
map.computeIfAbsent(key, func);

答案 1 :(得分:3)

您可以只创建一个带参数的lambda并忽略该参数来调用函数。

map.computeIfAbsent(key, k -> func());

答案 2 :(得分:2)

如果func在计算上并不昂贵且没有副作用,那么您可以使用putIfAbsent(注意,它是' put ',而不是'compute')并调用该方法直接。在语义上是等效的。

map.putIfAbsent(key, func());

func每次都会进行评估,无论是否要插入它,但前提是它很快,那实际上不是问题。

答案 3 :(得分:0)

https://www.here2u.com/rest/V1/products?searchCriteria[filter_groups][0][filters][0][field]=category_id&searchCriteria[filter_groups][0][filters][0][value]=329&searchCriteria[filter_groups][0][filters][1][field]=shopify_size&searchCriteria[filter_groups][0][filters][1][value]=423&searchCriteria[filter_groups][0][filters][2][field]=shopify_color&searchCriteria[filter_groups][0][filters][2][value]=422 用于使用给定的映射函数来计算给定键的值(如果键尚未与某个值关联(或被映射为null),然后将该计算的值输入computeIfAbsent(Key, Function)中)否则为null。按照语法

Hashmap

您可以写-

public V computeIfAbsent(K key, Function<? super K, ? extends V> remappingFunction)

map.computeIfAbsent(key, k -> Object());

答案 4 :(得分:0)

computeIfAbsent具有两个参数:

  • key-与指定值关联的键
  • mappingFunction-计算值的函数(此类型 Function,一个功能接口,它带有一个参数, 返回结果。)

没有其他方法可以为方法computeIfAbsent指定参数。这是使用此Map方法的示例:

输入:Map<String, Integer> map: {four=4, one=1, two=2, three=3, five=5}

map.computeIfAbsent("ten", k -> new Integer(10));   // adds the new record to the map
map.computeIfAbsent("twelve", k -> null);           // record is not added, the function returns a null
map.computeIfAbsent("one", k -> new Integer(999999));   // record is not updated, the key "one" already exists -
                                                        // and has a non-null value
map.put("eleven", null);                                // new record with null value
map.computeIfAbsent("eleven", k -> new Integer(11));    // updates the record with new value

输出:{four=4, one=1, eleven=11, ten=10, two=2, three=3, five=5}


考虑代码map.computeIfAbsent("ten", k -> new Integer(10));

代码说我想向map插入一个新的映射(键-值对)。方法computeIfAbsent需要指定 key ,即“十”。 value 是从Function派生而来的,它以键作为输入参数并产生结果;结果被设置为映射的值。

在该示例中,键值对添加到地图:“ ten”,10。

lambda表达式k -> new Integer(10)功能接口 Function<String, Integer>的实例。该代码也可以表示为:

Function<String, Integer> fn = k -> new Integer(10);
map.computeIfAbsent("ten", fn);