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));
    }
}
相关推荐
java1234_小锋1 天前
Redis到底支不支持事务啊?
java·数据库·redis
爱笑的眼睛111 天前
超越`cross_val_score`:深入剖析Scikit-learn交叉验证API的设计哲学与高阶实践
java·人工智能·python·ai
L0CK1 天前
三种依赖注入详解
java
shoubepatien1 天前
JAVA -- 07
java·后端·intellij-idea
Gu_yyqx1 天前
Maven进阶
java·maven
小肖爱笑不爱笑1 天前
JavaScript
java·javascript·json·web
专注于大数据技术栈1 天前
java学习--String和StringBuffer互转
java·学习
waper971 天前
nohup java -jar启动jar包错报错 地址已在使用
java·开发语言·jar
無量1 天前
ConcurrentHashMap实现原理
java·后端
Selegant1 天前
Kubernetes + Helm + ArgoCD:打造 GitOps 驱动的 Java 应用交付流水线
java·kubernetes·argocd