Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等12种最常用方法

简介: Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等12种最常用方法

Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等12种最常用方法

import com.alibaba.fastjson.JSON;
import org.assertj.core.util.Lists;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author gzh -》javaNice
 * *
 */
public class StreamDemo {
   
   
    public static void main(String[] args) {
   
   
        User user1=new User("1","zhangsan",1);
        User user2=new User("2","zhangsan",2);
        User user3=new User("3","lisi",2);

        List<User> userList= Lists.newArrayList();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);


        //1、list转map,指定key-value,key,value是对象中的某个属性值.
        Map<String,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User::getName));
        System.out.println("1->"+userMap1);

        //2、list转map 指定key-value,key为属性值,value是对象本身
        Map<String,User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId,User->User));
        System.out.println("2->"+userMap2);

        //3、list转map 指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身
        Map<String,User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
        System.out.println("3->"+userMap3);

        //4、指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身,遇到key 冲突的解决办法,选择第二个key的值value2覆盖第一个key的值value1。
        Map<String,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getName, Function.identity(),(value1,value2)->value2));
        System.out.println("4->"+userMap4);

        //5、指定key-value,按照name进行分组 value是对象集合
        Map<String, List<User>> userMap5 = userList.stream().collect(Collectors.groupingBy(User::getName));
        System.out.println("5->"+userMap5);

        //6.统计所有age
        Integer totalAge = userList.stream().map(User::getAge).reduce(0, Integer::sum);
        System.out.println("6总年龄->"+totalAge);

        //7.只对名称为zhangsan的age  进行统计汇总
        Integer totalAgeFilter = userList.stream().filter(t -> t.getName().equals("zhangsan")).map(User::getAge).reduce(0, Integer::sum);
        System.out.println("7总年龄filter->"+totalAgeFilter);

        //8.获取最大age
        Integer maxAge = userList.stream().map(User::getAge).max((x, y) -> x - y).get();
        System.out.println("8最大年龄->"+maxAge);

        //9.循环打印
        userList.stream().forEach(user -> System.out.println("9->"+user));

        //10.获取名称集合
        List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
        System.out.println("10名称集合->"+ JSON.toJSONString(nameList));

        //11.key为多字段拼接,value为某个属性
        Map<String, Integer> map = userList.stream()
                .collect(Collectors.toMap(p -> p.getName() + p.getAge() + p.getId(), User::getAge));
        System.out.println("11->"+ JSON.toJSONString(map));

        //12.按多字段分组
        Map<String, List<User>> nameAgeMap = userList.stream()
                .collect(Collectors.groupingBy(l -> l.getName() +"-" + l.getAge()));
        System.out.println("12->"+ JSON.toJSONString(nameAgeMap));


    }
}

image-20231024161601339

目录
相关文章
|
17天前
|
存储
`map()`方法在什么场景下会比 `forEach()`方法更高效?
综上所述,当需要对数组元素进行复杂的转换并生成新数组、进行链式调用和函数式编程、处理元素之间存在明确映射关系的情况以及与其他数组方法结合使用时,`map()`方法比`forEach()`方法更高效,能够使代码更加简洁、清晰和易于维护。
53 32
WK
|
1月前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
70 36
|
17天前
|
存储 JavaScript 前端开发
如何选择使用`map()`方法和`forEach()`方法?
选择使用`map()`方法还是`forEach()`方法主要取决于操作的目的、是否需要返回值、代码的可读性和维护性等因素。在实际开发中,需要根据具体的业务需求和场景来灵活选择合适的方法,以实现更高效、更易读和更易维护的代码。
21 3
|
27天前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
30 1
|
2月前
|
存储 JavaScript 前端开发
《进阶篇第8章:vuex》包括理解vuex、安装vuex、搭建vuex环境、四个map方法的使用、模块化+名命空间
《进阶篇第8章:vuex》包括理解vuex、安装vuex、搭建vuex环境、四个map方法的使用、模块化+名命空间
19 3
|
2月前
|
Java
vue2知识点:vuex中四个map方法的使用,包括:mapState、mapGetters、mapMutations、mapActions
vue2知识点:vuex中四个map方法的使用,包括:mapState、mapGetters、mapMutations、mapActions
110 1
|
3月前
|
Java C# Swift
Java Stream中peek和map不为人知的秘密
本文通过一个Java Stream中的示例,探讨了`peek`方法在流式处理中的应用及其潜在问题。首先介绍了`peek`的基本定义与使用,并通过代码展示了其如何在流中对每个元素进行操作而不返回结果。接着讨论了`peek`作为中间操作的懒执行特性,强调了如果没有终端操作则不会执行的问题。文章指出,在某些情况下使用`peek`可能比`map`更简洁,但也需注意其懒执行带来的影响。
151 2
Java Stream中peek和map不为人知的秘密
|
3月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
3月前
|
存储 JavaScript 前端开发
`forEach()`方法和`map()`方法哪个执行效率更高?
`forEach()`方法和`map()`方法哪个执行效率更高?
|
3月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用