jdk1.8 lambda表达式给map排序

最近有人问我,你知道给lambda给复杂的map排序怎么优雅的写吗,然后我就不知道了,于是在网上找了一些相关资料,在这里记录一下,避免以后别人拿我当大佬,以为我博学多才,才高八斗,然后我一脸的囧境

简单的Map<Stirng String>这种网上找一下还是蛮多的,但是复杂类型的比较少
底下这个是给Map<String List> 排序

package com.example.demo.test;

import com.example.demo.model.TestModel;
import lombok.extern.log4j.Log4j2;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toList;

/**
 * @Author yangyanglittlefriend
 * @Date 2022/7/6 11:29
 * @Version 1.0
 */
@Log4j2
public class TestMapSorted {
    
    public static void main(String[] args) {
        TestModel testModel = new TestModel("a", 1);
        TestModel testModel2 = new TestModel("b", 2);
        TestModel testModel3 = new TestModel("c", 3);
        TestModel testModel4 = new TestModel("d", 4);
        TestModel testModel5 = new TestModel("a", 5);
        List<TestModel> testModels = new ArrayList<>();
        testModels.add(testModel);
        testModels.add(testModel2);
        testModels.add(testModel3);
        testModels.add(testModel4);
        testModels.add(testModel5);

        Map<String, List<TestModel>> stringListMap = testModels.stream()
                .collect(Collectors.groupingBy(TestModel::getName));

        // 用sorted获取map中最大的那个value
        List o = stringListMap.entrySet().stream()
                .sorted((Map.Entry<String,  List<TestModel>> o1, Map.Entry<String, List<TestModel>> o2) -> o2.getValue().size() - o1.getValue().size())
        .map(Map.Entry::getKey).collect(toList());
        List<TestModel> maxValue = stringListMap.get(o.get(0));
        log.info("max maxValue size:{}", maxValue);

        // 用sorted获取map中最大的那个value
        Optional<List<TestModel>> testModelList = stringListMap.entrySet().stream()
                .sorted((Map.Entry<String,  List<TestModel>> o1, Map.Entry<String, List<TestModel>> o2) 
                        -> o2.getValue().size() - o1.getValue().size())
                .map(Map.Entry::getValue).findFirst();
        log.info("max testModel size:{}", testModelList);

        // 用max获取map中最大的那个value
        Optional sort = stringListMap.entrySet().stream().max(Comparator.comparing(x->x.getValue()== null ? 0:x.getValue().size()));
        log.info("max testModel size:{}", sort);
    }
}

1、底下这个是网上找的,这个里面写了一些用法,但是少了对map的排序
https://blog.csdn.net/mayaohao/article/details/117566732
2、这个里面挺全的,写了好多示例
https://blog.csdn.net/alan_liuyue/article/details/110185139
3、这个里面的也可以去看看,写的也很全
https://blog.csdn.net/mingyuli/article/details/112910938

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值