java8的stream流处理使用例子

java8的stream流常用例子

数据准备

		//准备map数据
        List<Map<String,String>> mapDatas = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Map<String,String> map = new HashMap<>();
            if (i % 2 == 0){
                map.put("province","北京");
                map.put("listcount",""+i*Math.round(15f));
                map.put("index","count"+i);
            }else {
                map.put("province","上海");
                map.put("listcount",""+i*Math.round(15f));
                map.put("index","count"+i);
            }
            mapDatas.add(map);
        }

        //准备entity数据
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student("1231","典韦","男","2011-09-08","12379","刀"));
        studentList.add(new Student("1233","孙尚香","女","2012-09-08","12379","枪"));
        studentList.add(new Student("1232","李白","男","2010-09-08","12379","剑"));
        studentList.add(new Student("1234","王昭君","女","2010-09-08","12379","棍子"));

1. stream().forEach

		//1 stream().forEach的使用(对象list跟maplist是一样使用的)
        mapDatas.stream().forEach(map -> {
        	//获取当前map的索引
        	int curIndex = mapDatas.indexOf(map);
            System.err.println(map);
        });        

在这里插入图片描述

2. stream().filter

		//2 stream().filter 的用法 过滤出北京的数据
        List<Map<String, String>> filterDatas = mapDatas.stream().filter(map -> {
            return map.get("province").equals("北京");
        }).collect(Collectors.toList());
        System.err.println(filterDatas);
        结果:
        [{listcount=0, province=北京, index=count0}, {listcount=30, province=北京, index=count2}, {listcount=60, province=北京, index=count4}, {listcount=90, province=北京, index=count6}, {listcount=120, province=北京, index=count8}]

3. stream().map

		//3 stream().map 提取list对象的某个属性为list,也可以提取map的某个key
        List<String> snames = studentList.stream().map(student -> {
            return student.getSname();
        }).collect(Collectors.toList());
        System.err.println(snames);
        结果:
        [典韦, 孙尚香, 李白, 王昭君]

4. stream().sorted

		//4 stream().sorted 根据某个属性排序
        // 升序
        // entity排序
        List<Student> sortStudents = studentList.stream()
                .sorted(Comparator.comparing(Student::getSno))
                .collect(Collectors.toList());
        System.err.println(sortStudents);
        System.err.println("-------------");

        // map 排序
        List<Map<String, String>> mapSortDatas = mapDatas.stream()
                .sorted(Comparator.comparing(map -> (map.get("index"))))
                .collect(Collectors.toList());
        System.err.println(mapSortDatas);
        System.err.println("------------------");

        //降序
        // entity排序
        List<Student> sortStudents2 = studentList.stream()
                .sorted((student1, student2) -> student2.getSno().compareTo(student1.getSno()))
                .collect(Collectors.toList());
        System.err.println(sortStudents2);
        System.err.println("-------------");

        // map 排序
        List<Map<String, String>> mapSortDatas2 = mapDatas.stream()
                .sorted((map1, map2) -> map2.get("index").compareTo(map1.get("index")))
                .collect(Collectors.toList());
        System.err.println(mapSortDatas2);
		结果:
		[Student{sno='1231', sname='典韦', sex='男', birthday='2011-09-08', phone='12379', dorm='刀'}, Student{sno='1232', sname='李白', sex='男', birthday='2010-09-08', phone='12379', dorm='剑'}, Student{sno='1233', sname='孙尚香', sex='女', birthday='2012-09-08', phone='12379', dorm='枪'}, Student{sno='1234', sname='王昭君', sex='女', birthday='2010-09-08', phone='12379', dorm='棍子'}]
		-------------
		[{listcount=0, province=北京, index=count0}, {listcount=15, province=上海, index=count1}, {listcount=30, province=北京, index=count2}, {listcount=45, province=上海, index=count3}, {listcount=60, province=北京, index=count4}, {listcount=75, province=上海, index=count5}, {listcount=90, province=北京, index=count6}, {listcount=105, province=上海, index=count7}, {listcount=120, province=北京, index=count8}, {listcount=135, province=上海, index=count9}]
		------------------
		[Student{sno='1234', sname='王昭君', sex='女', birthday='2010-09-08', phone='12379', dorm='棍子'}, Student{sno='1233', sname='孙尚香', sex='女', birthday='2012-09-08', phone='12379', dorm='枪'}, Student{sno='1232', sname='李白', sex='男', birthday='2010-09-08', phone='12379', dorm='剑'}, Student{sno='1231', sname='典韦', sex='男', birthday='2011-09-08', phone='12379', dorm='刀'}]
		-------------
		[{listcount=135, province=上海, index=count9}, {listcount=120, province=北京, index=count8}, {listcount=105, province=上海, index=count7}, {listcount=90, province=北京, index=count6}, {listcount=75, province=上海, index=count5}, {listcount=60, province=北京, index=count4}, {listcount=45, province=上海, index=count3}, {listcount=30, province=北京, index=count2}, {listcount=15, province=上海, index=count1}, {listcount=0, province=北京, index=count0}]

5. stream().collect 利用Collectors分组
list entity分组
在这里插入图片描述
list map 分组
在这里插入图片描述

分组过后排序(根据某一字段排序)

	list entity 分组排序
		Map<String, List<Student>> sortGroupStudent = studentList.stream()
                .sorted(Comparator.comparing(Student::getSno))
                .collect(Collectors.groupingBy(Student::getSex));
        System.err.println(sortGroupStudent);
        结果:
        {=[Student{sno='1233', sname='孙尚香', sex='女', birthday='2012-09-08', phone='12379', dorm='枪'}, Student{sno='1234', sname='王昭君', sex='女', birthday='2010-09-08', phone='12379', dorm='棍子'}],=[Student{sno='1231', sname='典韦', sex='男', birthday='2011-09-08', phone='12379', dorm='刀'}, Student{sno='1232', sname='李白', sex='男', birthday='2010-09-08', phone='12379', dorm='剑'}]}
	list map 分组排序
		Map<String, List<Map<String, String>>> sortGroupMap = mapDatas.stream().sorted(Comparator.comparing(map -> map.get("index")))
                .collect(Collectors.groupingBy(map -> (map.get("province"))));
        System.err.println(sortGroupMap);
        结果:
        {上海=[{listcount=15, province=上海, index=count1}, {listcount=45, province=上海, index=count3}, {listcount=75, province=上海, index=count5}, {listcount=105, province=上海, index=count7}, {listcount=135, province=上海, index=count9}], 北京=[{listcount=0, province=北京, index=count0}, {listcount=30, province=北京, index=count2}, {listcount=60, province=北京, index=count4}, {listcount=90, province=北京, index=count6}, {listcount=120, province=北京, index=count8}]}

分组过后根据key排序

entity分组根据key排序

在这里插入图片描述

       Map<String, List<GroundwaterPointEntity>> groupDatas = groundwaterPointEntities
                .stream().sorted(Comparator.comparing(GroundwaterPointEntity::getPointtype)).collect(Collectors.toList())
                .stream().collect(Collectors.groupingBy(GroundwaterPointEntity::getPointtype,LinkedHashMap::new,Collectors.toList()));
	结果:		

在这里插入图片描述

groupingBy解析
类似于Collectors.groupingBy(GWYearMonitorPointDto::getPointtypename)这种
默认进来是这个方法
在这里插入图片描述

继续点到下一层
在这里插入图片描述

可以看到groupingBy默认给了一个hashmap返回数据结构
当用对象entity进行分组的时候可以用这种分组构造方法,传入LinkedHashMap进行排序

map分组根据key排序

在这里插入图片描述

LinkedHashMap<Serializable, List<Map<String, Serializable>>> pointtype = allGWLevelDataList
                .stream().collect(Collectors.groupingBy(temp -> temp.get("pointtype"))).entrySet()
                .stream().sorted((o1, o2) -> {
                    return String.valueOf(o1).compareTo(String.valueOf(o2));
                }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldvalue, newvalue) -> oldvalue, LinkedHashMap::new));
先将数据分组,然后再把分组后的数据进行排序利用Collectors.toMap
返回一个排序后的新map

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 8中的Stream API支持通过`flatMap`方法来实现的复合操作。这个方法可以将一个中的每个元素转换成另一个,然后将这些合并成一个。在此基础上,可以进行更多的中间操作和终端操作。 下面是一个示例代码,演示了如何使用Stream的复合: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamDemo { public static void main(String[] args) { List<String> words = Arrays.asList("hello", "world", "java"); List<String> letters = words.stream() .flatMap(word -> Arrays.stream(word.split(""))) .distinct() .sorted() .collect(Collectors.toList()); System.out.println(letters); } } ``` 在这个示例代码中,我们首先定义了一个字符串列表`words`。接着,我们使用`flatMap`方法将这个列表中的每个字符串都转换成一个字符,并将这些字符合并成一个。然后,我们对这个进行了去重、排序等操作,并将结果收集到了一个新的列表中。 运行这段代码,输出结果为: ``` [a, d, e, h, j, l, o, r, w] ``` 这个结果是将原来列表中的所有字符去重、排序后得到的结果。 需要注意的是,`flatMap`方法返回的是一个新的,因此可以继续进行后续的操作。同时,由于`flatMap`方法需要将一个元素转换成一个,因此需要传入一个函数作为参数。这个函数的返回值必须是一个。 ### 回答2: Java 8引入了Stream API,使得我们可以更方便地对集合和数组进行处理和操作。Stream API提供了一种式操作的方式,可以实现数据的筛选、转换、排序等功能。 Java 8中的Stream API支持通过多种方式创建,如通过集合对象的stream()方法、Arrays类的stream()方法、Stream类的of()方法等。在创建了之后,我们可以通过一系列的中间操作和终端操作对进行操作。 复合是指通过多个操作的组合来实现更复杂的操作。Java 8中可以使用多个中间操作来构建一个水线操作。例如,我们可以先对数据进行筛选,然后对筛选后的数据进行映射处理,接着再进行排序等。这种操作可以通过链式调用来实现,每个中间操作都返回一个新的对象,可以继续对其进行下一步操作。 常见的中间操作有filter、map、flatMap、distinct等,用于对中的元素进行过滤、映射、扁平化等操作。而终端操作主要用于触发的执行,如forEach、collect、reduce等,用于获取中的结果或将结果收集到一个集合中。 通过复合使用,我们可以更简洁地实现复杂的数据操作,减少了对临时变量和循环的依赖,使得代码更易读、更易维护。但需要注意的是,是一次性的,即一旦对进行了终端操作,就不可再对其进行其他操作。因此,在使用操作时要谨慎选择合适的中间和终端操作,以避免产生不必要的计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值