在地图键上应用一个函数

时间:2018-02-02 13:56:25

标签: java java-stream

我有一个返回地图的函数。 我想知道如果可以在地图的键上应用一个函数来存储函数(Id)而不是密钥Id。 一次性完成这项工作是完美的。 这是我的功能代码:

 public Map<String, List<Object>> getMap(final List<Object> listOfObjects) {

    Map<String, List<Object>> map = (listOfObjects.stream().collect(Collectors.groupingBy(Object::getId)));

    return map;
} 
public class Object {
    int id,
    String msg
    int getId() {
        return id;
    }
}

int function( int id) {
    // some code
}

我想要存储在地图中的是函数(id)而不是id

1 个答案:

答案 0 :(得分:0)

您可以拥有一个接收列表的通用实用程序方法和一个将列表中的每个项目转换为您想要的任何项目的函数,并使用此函数的结果作为地图的键:

public static <K, V> Map<K, List<V>> getMap(
        List<V> list,
        Function<? super V, ? extends K> keyMapper) {

    return list.stream()
        .collect(Collectors.groupingBy(keyMapper));
}

用法:

Map<Integer, List<Item>> map = getMap(listOfItems, Item::getId);

这与您的代码完全相同,但我已将您的Object课程重命名为Item,因为Object是一个与java.lang.Object冲突的误导性名称。< / p>

现在,如果要在将每个条目放入地图之前转换每个对象的id:

Function<Item, Integer> function = Item::getId;
Map<Integer, List<Item>> mapWithIncrementedKeys = getMap(
    listOfItems, 
    function.andThen(i -> i + 1));

这将通过在将其用作返回的地图的键之前递增其值来转换每个项的id。