传递lambda作为方法arg和排序映射

时间:2017-04-25 09:49:04

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


我必须创建Sorted方法,使用map参数和lambda-expression调用。该方法返回作为第一个参数传递的任何映射的排序版本,排序顺序由作为第二个参数给出的lambda表达式确定。 我创造了类似的东西(不正常工作):

public Map sorted(Map map, Function<Set> funct){


    System.out.println(map.entrySet()
       .stream()
       .sorted((Comparator) funct)
       .collect(Collectors.toList()));
     return null;
}

有什么想法吗?
谢谢你的帮助;)

3 个答案:

答案 0 :(得分:3)

如果您希望有序地图$(document).ready(function() { var table = $('#userTable').DataTable( { "sAjaxSource": "/MyApp/proctoring/user/getAll", "sAjaxDataProp": "users", "columns": [ { "data": "username" }, { "data": "name" }, { "data": "surname" }, { "data": "status" }, { "data": "emailAddress" }, { "data" : "userId" } ], "aoColumnDefs": [ { "aTargets": [5], "mData": "userId", "mRender": function (data, type, full) { return '<button href="#"' + 'id="'+ data + '">Edit</button>'; } } ] } ); $('#userTable tbody').on( 'click', 'button', function () { var data = table.row( $(this).parents('tr') ).data(); console.log(data); $('#userEditModal').modal('show'); }); } ); 假设比较器按TreeMap排序,则它可能如下所示:

Key

对它的调用就像这样:

 public static <K, V> TreeMap<K, V> sorted(Map<K, V> map, Comparator<? super K> cmp) {

    return map.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey,     
                          Map.Entry::getValue, 
                          (left, right) -> left, 
                          () -> new TreeMap<K, V>(cmp)));

}

答案 1 :(得分:2)

当我读到这个问题时,我想到了一个更通用的解决方案,你可以在键或值上对地图进行排序。在这种情况下,解决方案如下所示:

public static <K,V> Map<K,V> sorted(Map<K,V> map, Comparator<Map.Entry<K, V>> comparator){
    return map.entrySet()
       .stream()
       .sorted(comparator)
       .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
}

如果您想要按值排序,可以使用以下方法:

sorted(yourMap, Entry.comparingByValue());

答案 2 :(得分:-1)

如果您希望将ToIntBiFunction推荐给Comparator,您可以使用此功能:

void sortByEntry() {
    Map<?, ?> map = new HashMap<>();
    Map<?, ?> sorted = sorted(map, this::comparingEntry);
}

<K, V> Map<K, V> sorted(Map<K, V> map, 
                        ToIntBiFunction<Entry<K, V>, Entry<K, V>> comparator) {
    return map.entrySet().stream()
            .sorted(comparator::applyAsInt)
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue
                                    , (v1, v2) -> v2, LinkedHashMap::new));
}

<K, V> int comparingEntry(Entry<K, V> left, Entry<K, V> right) {
    return ...;
}