JDK8新特性:Stream

Stream

认识Stream

  • 也叫Stream流,是jdk8开始新增的一套API(java.util.stream.*),可以用于操作集合或者数组的数据。
  • 优势:Stream流大量的结合了Lambda的语法风格来编程,提供了一种更强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。

案例:体验Stream

需求:
  • 把集合 中所有以"张"开头,且是3个字的元素存储到一个新的集合。
java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        Collections.addAll(names,"张三丰","张无忌","周芷若","赵敏","张强");
        System.out.println(names);

        List<String> list = names.stream().filter(s -> s.startsWith("张"))
                .filter(a -> a.length()==3).collect(Collectors.toList());
        System.out.println(list);
    }
}

Stream流的使用步骤

常用方法

1.获取Stream流

  • 获取集合的Stream流
Collection提供的如下方法 说明
default Stream<E> stream() 获取当前集合对象的Stream流
  • 获取数组的Stream流

2.Stream流常见的中间方法

  • 中间方法指的是调用完成后会返回新的Stream流,可以继续使用(支持链式编程)。
java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) {
        List<Double> scores = new ArrayList<>();
        Collections.addAll(scores,88.5,100.0,60.0,99.0,9.5,99.6,25.0);
        // 需求1:找出成绩大于60分的数据,并升序后输出
        scores.stream().filter(s -> s >= 60).sorted().forEach(s -> System.out.println(s));

        List<Student> students = new ArrayList<>();
        Student s1 = new Student("张三",26,172.5);
        Student s2 = new Student("张三",26,172.5);
        Student s3 = new Student("李四",23,167.6);
        Student s4 = new Student("王五",25,183.5);
        Student s5 = new Student("赵六",35,167.0);
        Collections.addAll(students,s1,s2,s3,s4,s5);

        //需求2:找出年龄大于等于23,且年龄小于等于30岁的学生,并按照年龄降序排序
        students.stream().filter(s -> s.getAge()>=23 && s.getAge()<=30)
                .sorted((o1, o2) -> o2.getAge() - o1.getAge())
                .forEach(s -> System.out.println(s));

        //需求3:取出身高最高的前3名学生,并输出
        students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(),o1.getHeight()))
                .limit(3).forEach(s -> System.out.println(s));

        //需求4:取出身高倒数的2名学生,并输出
        students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(),o1.getHeight()))
                .skip(students.size() - 2).forEach(s -> System.out.println(s));

        //需求5:找出身高超过168的学生叫说明名字,要求去除重复的名字,再输出
        students.stream().filter(s -> s.getHeight() > 168).map(Student::getName)
                .distinct().forEach(s -> System.out.println(s));

        // distinct去重复,自定义类型的对象(希望内容一样就认为重复,重写hashCode,equals)
        students.stream().filter(s -> s.getHeight() >168)
                .distinct().forEach(System.out::println);

        // 合并流
        Stream<String> str1 = Stream.of("张三","李四");
        Stream<String> str2 = Stream.of("王五","赵六");
        Stream<String> allStr = Stream.concat(str1,str2);
        allStr.forEach(s -> System.out.println());
    }
}

3.Stream流常见的终结方法

  • 终结方法指的是调用完成后,不会返回新的Stream了,没法继续使用流了。
  • 收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回
  • Stream流:方便操作集合/数组的手段;集合/数组:才是开发中的目的
java 复制代码
import java.util.*;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Student s1 = new Student("张三",26,172.5);
        Student s2 = new Student("张三",26,172.5);
        Student s3 = new Student("李四",23,167.6);
        Student s4 = new Student("王五",25,183.5);
        Student s5 = new Student("赵六",35,167.0);
        Collections.addAll(students,s1,s2,s3,s4,s5);

        // 需求1:请计算出身高超过168的学生有几人
        long size = students.stream().filter(s -> s.getHeight() > 168).count();
        System.out.println(size);

        // 需求2:找出身高最高的学生,并输出
        Student s = students.stream().max((o1, o2) -> Double.compare(o1.getHeight(),o2.getHeight())).get();
        System.out.println(s);

        // 需求3:找出身高最高的学生,并输出
        Student ss = students.stream().min((o1, o2) -> Double.compare(o1.getHeight(),o2.getHeight())).get();
        System.out.println(ss);

        // 需求4:找出身高超过170的学生对象,并放到一个新的集合中去
        //流只能收集一次
        List<Student> students1 = students.stream().filter(a ->a.getHeight() > 170).collect(Collectors.toList());
        System.out.println(students1);

        Set<Student> students2 = students.stream().filter(a -> a.getHeight() > 170).collect(Collectors.toSet());
        System.out.println(students2);

        // 需求5:找出身高超过170的学生对象,并把学生对象的名字和身高,存入到一个Map集合返回
        Map<String,Double> map =
                students.stream().filter(a -> a.getHeight() > 170)
                        .distinct().collect(Collectors.toMap(a -> a.getName(),a -> a.getHeight()));
        System.out.println(map);

        Student[] arr = students.stream().filter(a -> a.getHeight() > 170).toArray(len -> new Student[len]);
        System.out.println(Arrays.toString(arr));
    }
}
相关推荐
瑞雪兆丰年兮15 分钟前
[从0开始学Java|第十一天]学生管理系统
java·开发语言
看世界的小gui15 分钟前
Jeecgboot通过Maxkey实现单点登录完整方案
java·spring boot·jeecgboot
Arvin62716 分钟前
IntelliJ IDEA:无法读取**.properties
java·intellij-idea
10km21 分钟前
Spring Boot 环境下使用 Map<String, MultipartFile> 实现文件上传功能
java·spring boot·mock·map·multipartfile
学到头秃的suhian43 分钟前
Java的锁机制
java
Amarantine、沐风倩✨1 小时前
一次线上性能事故的处理复盘:从 SQL 到扩容的工程化思路
java·数据库·sql·oracle
tb_first1 小时前
万字超详细苍穹外卖学习笔记1
java·jvm·spring boot·笔记·学习·tomcat·mybatis
代码匠心1 小时前
从零开始学Flink:状态管理与容错机制
java·大数据·后端·flink·大数据处理
zhougl9961 小时前
Java内部类详解
java·开发语言
茶本无香1 小时前
设计模式之十二:模板方法模式Spring应用与Java示例详解
java·设计模式·模板方法模式