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));
    }
}
相关推荐
可乐配鸡翅7 分钟前
day seven 猜数字小游戏
java
张小凡vip9 分钟前
Java Web 设置 Session 超时时间:如何让 Session 永不失效
java·spring boot
浪里摸鱼10 分钟前
Java 泛型快速学习指南(面向接口扫描场景)
java
我是大猴子20 分钟前
redis执行get等命令时底层操作
java
叶总没有会30 分钟前
微服务--分布式基础
java·spring·spring cloud·微服务
鹿角片ljp31 分钟前
Prompt Cache、Token 成本与 Plan Compiler 的工程设计
java·python·算法
Wang's Blog1 小时前
Java 接入Redis: 五大数据类型与存储结构选型
java·服务器·redis
Wang's Blog1 小时前
Java 接入Redis: 字符串与哈希类型操作命令
java·服务器·redis
智慧物业老杨6 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
星空8 小时前
金蝶苍穹build.gradle配置
java·build.gradle