JDK8 stream常用的几个方法

​​​​​​​​​​​​​​

目录

map

map和flatMap

filter

findAny和findFirst

parallelStream

​​​​​​​sorted

reduce对数据进行归纳


​​​​​​​

  • map

 可以使用map方法把对象中的某个属性取出后,重新(加工)组成新的列表。

        Student s1 = new Student("AB-1", 10);
        Student s2 = new Student("CD-2", 12);
        Student s3 = new Student("EF-3", 15);

        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);

        List<String> names1 = list.stream().map(Student::getName).collect(Collectors.toList());
        List<String> names2 = list.stream().map(student -> student.getName().replace("-", "")).collect(Collectors.toList());
        
        System.out.println(names1);
        System.out.println(names2);

日志: 

[AB-1, CD-2, EF-3]
[AB1, CD2, EF3]

  • map和flatMap

flatMap可以理解为把每个加工后对象又生成String[],把这些String[]生成新的流,相当于扁平化了。

        Student s1 = new Student("AB-1", 10);
        Student s2 = new Student("CD-2", 12);
        Student s3 = new Student("EF-3", 15);

        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);

        // 获取name后直接打印
        list.stream().map(Student::getName).forEach(System.out::println);
        // 获取name后使用map方法分隔打印
        list.stream().map(Student::getName).map(name -> name.split("-")).forEach(names -> System.out.println(Arrays.toString(names)));
        // 获取name后使用flatMap方法分隔打印
        list.stream().map(Student::getName).flatMap(name -> Arrays.stream(name.split("-"))).forEach(System.out::println);

 日志:

AB-1
CD-2
EF-3

[AB, 1]
[CD, 2]
[EF, 3]

AB
1
CD
2
EF
3
  • filter

过滤掉符合条件的对象

        Student s1 = new Student("AB-1", 10);
        Student s2 = new Student("CD-2", 12);
        Student s3 = new Student("EF-3", 15);

        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);

        List<Student> students = list.stream().filter(student -> student.getAge() > 10).collect(Collectors.toList());

        System.out.println(students);

日志:

[{"name":"CD-2","age":12}, {"name":"EF-3","age":15}]
  • findAny和findFirst

找到列表中任一符合条件的对象,无序的,只要满足就返回。注意如果使用stream方法,findAny会一直返回第一个对象,因为stream是串行有序的;如果使用parallelStream流,返回的就是任一一个了。

findFirst,顾名思义返回第一个满足条件的对象。

        Student s1 = new Student("AB-1", 10);
        Student s2 = new Student("CD-2", 12);
        Student s3 = new Student("EF-3", 15);
        Student s4 = new Student("GH-4", 10);

        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);

        Student student1 = list.stream().filter(s -> s.getAge() > 10).findAny().get();
        Student student2 = list.parallelStream().filter(s -> s.getAge() > 10).findAny().get();
        Student student3 = list.stream().filter(s -> s.getAge() > 10).findFirst().get();

        System.out.println(student1);
        System.out.println(student2);
        System.out.println(student3);

日志:

{"name":"CD-2","age":12}
{"name":"EF-3","age":15}
{"name":"CD-2","age":12}
  • parallelStream

当数据量大时,采用parallelStream,会把数据分成多个小任务,多线程处理数据,提高处理速度。
是否使用parallelStream需要考虑几个方面:
数据是否足够大;任务之间是否独立;输出结果是否需要有序。

  • ​​​​​​​sorted

可以对数据进行排序,多个字段亦可。

        Student s1 = new Student("AB-1", 10);
        Student s2 = new Student("CD-2", 12);
        Student s3 = new Student("EF-3", 15);
        Student s4 = new Student("GH-4", 18);
        Student s5 = new Student("GH-4", 14);

        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        list.add(s5);

        List<Student> students = list.stream().sorted(Comparator.comparing(Student::getName).thenComparing(Student::getAge)).collect(Collectors.toList());

        System.out.println(students);

日志: 

[{"name":"AB-1","age":10}, {"name":"CD-2","age":12}, {"name":"EF-3","age":15}, {"name":"GH-4","age":14}, {"name":"GH-4","age":18}]
  • reduce对数据进行归纳

        Student s1 = new Student("AB-1", 10);
        Student s2 = new Student("CD-2", 12);
        Student s3 = new Student("EF-3", 15);

        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);

        int total = list.stream().map(Student::getAge).reduce(0, Integer::sum);

        System.out.println(total);

日志

37

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值