java8 Stream流 Map、List排序

// 实体类
public static class User {
 
    private String id;
 
    private String name;
 
    private String value;
 
    private String year;
}

1.List转Map

List<User> list = userMapper.selectAll(param);
List 转 Map
 
Map<String, String> idMap = list.stream().collect(Collectors.toMap(x -> x.getId(), y -> y.getName() + "_" + y.getValue(), (e1,e2) -> e1, LinkedHashMap::new));
 
// 以 id为Map key
Map<String, List<User>> idMap = list.stream().collect(Collectors.groupingBy(User::getId));
 
// 以 id_name 为Map key
Map<String, List<User>> idMap = list.stream().collect(Collectors.groupingBy(x -> x.getId + "_" + x.getName));


2.Map排序

List<User> list = userMapper.selectAll(param);
// List 转 Map
Map<String, List<User>> idMap = list.stream().collect(Collectors.groupingBy(User::getId));
// 排序方式1 Map 根据 id 从小到大排序(降序修改(e1, e2) e1 e2 的位置换一换即可)
Map<String, List<User>> sort1IdMap = idMap.entrySet().stream().sorted((e1, e2) ->
             Integer.compare(Integer.parseInt(e1.getKey()),         
             Integer.parseInt(e2.getKey())))
             .collect(Collectors.toMap(Map.Entry::getKey, 
                Map.Entry::getValue, 
                (e1, e2) -> e1, 
                LinkedHashMap::new));
 
// 排序方式2 
Map<String, List<User>> sort2IdMap = idMap.entrySet().stream()
        .sorted(Map.Entry.<String,List<User>>comparingByKey().reversed())
            .forEachOrdered(x -> sortMap.put(x.getKey(),x.getValue()));
 
Map<String, List<User>> sort22IdMap = idMap.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
            .forEachOrdered(x -> sortMap.put(x.getKey(),x.getValue()));
 
//进阶
 
// Map 根据 另一个 Map 排序
Map<String, Integer> initMap = new LinkedHashMap<>();
initMap.put("张三",3);
initMap.put("李四",2);
initMap.put("王五",1);
 
// initMap 根据value排序
Map<String, Integer> m1 = initMap.entrySet().stream()
    .sorted((e1, e2) -> Integer.compare(e1.getValue(), e2.getValue()))
        .collect(Collectors.toMap(Map.Entry::getKey,
            Map.Entry::getValue,(e1, e2) -> e1,
                LinkedHashMap::new));
 
// name 作为key的Map
Map<String, List<User>> nameMap = list.stream().collect(Collectors.groupingBy(User::getName));
 
// nameMap 根据 ml的key值(name)进行排序
Map<String, List<User>> sortOtherMap = nameMap.entrySet().stream()
    .sorted((e1, e2) -> Integer.compare(m1.get(e1.getKey()), m1.get(e2.getKey())))
        .collect(Collectors.toMap(Map.Entry::getKey,
                                Map.Entry::getValue,
                                (e1, e2) -> e1,
                                LinkedHashMap::new));
 
 

3.List 排序

// 排序方式1 根据id 排序
List<User> sort2 = xkmlMcDmBos.stream().sorted(Comparator.comparing(User::getId,     
                     Comparator.reverseOrder())).collect(Collectors.toList());
 
// 排序方式2 根据id 排序
List<User> sort1 = list.stream().sorted((e1, e2) ->                             
                 Integer.compare(Integer.parseInt(e1.getId()),                 
                    Integer.parseInt(e2.getId()))).collect(Collectors.toList());
 
// 排序方式3 (List->String 排完序之后 转成为 name 的 List)
List<String> sort2 = xkmlMcDmBos.stream().sorted(Comparator.comparing(User::getId, 
               Comparator.reverseOrder())).map(User::getName).
                collect(Collectors.toList());
 
// 排序方式4
List<Map<String, Object>> sort3=  dataList.stream()
                .sorted(Comparator.comparing((Map<String, Object> x)  ->
                        Integer.parseInt(x.get("id").toString()))
                .reversed()).collect(Collectors.toList());
 
// 自己写一个取map参数的方法
public class GetMapValVo {
 
    public static Float comparingByXk(Map map){
        return Float.parseFloat((String) map.get("year"));
    }
 
}
// 未排序的List
List<Map<String, String>> res = new ArrayList<>();
// 接收排序的List
List<Map<String, String>> sortRes = new ArrayList<>();
sortRes = res.stream().sorted(Comparator.comparing(GetMapValVo::comparingByXk)).collect(Collectors.toList());

4.过滤

List<User> filterList = list.stream().filter(x -> x.getName().equals("张三"))
                .collect(Collectors.toList());;

5.求和

int total = list.stream().mapToInt(x -> Integer.parseInt(x.getValue())).sum();
 
// 过滤加求和
int total = list.stream().filter(x -> x.getName().equals("张三"))
            .mapToInt(x -> Integer.parseInt(x.getValue())).sum();

6.求最大值、最小啊、平均值

// 最大值
​​​​​​​int total = list.stream().mapToInt(x -> Integer.parseInt(x.getValue())).max();
 
// 最小值
​​​​​​​int total = list.stream().mapToInt(x -> Integer.parseInt(x.getValue())).mim();
 
// 平均值
​​​​​​​int total = list.stream().mapToInt(x -> Integer.parseInt(x.getValue())).average();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8中,可以使用Stream来将List分组。有两种方式可以实现单字段分组和多字段分组。 单字段分组可以使用groupingBy方法,按照name属性进行分组。你可以使用stream来实现这个操作,具体代码如下所示: Map<String, List<Map<String, Object>>> listMap = groupList.stream() .collect(Collectors.groupingBy(item -> item.get("name").toString())); 多字段分组可以使用groupingBy方法,按照name和age属性进行分组。你可以使用stream来实现这个操作,具体代码如下所示: Map<String, List<Map<String, Object>>> listMap = groupList.stream() .collect(Collectors.groupingBy(item -> item.get("name").toString() + "|" + item.get("age"))); 另外,如果你想对用户列表按照年龄进行排序,可以使用sorted方法。具体代码如下所示: List<User> userList = UserService.getUserList(); userList = userList.stream() .sorted((u1, u2) -> u1.getAge() - u2.getAge()) .collect(Collectors.toList()); 这样就可以按照年龄升序排序用户列表了。你也可以使用Comparator.comparingInt方法来简化代码: userList = userList.stream() .sorted(Comparator.comparingInt(User::getAge)) .collect(Collectors.toList()); 如果你想按照降序排序,可以使用reversed方法: userList = userList.stream() .sorted(Comparator.comparingInt(User::getAge).reversed()) .collect(Collectors.toList()); 这样就可以按照年龄降序排序用户列表了。希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java8使用streamList,Object>>分组(多字段key)](https://blog.csdn.net/weixin_43920527/article/details/129820467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Java8特性StreamList列表实现查询、统计、排序、分组](https://blog.csdn.net/xnian_/article/details/129985585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值