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));
    }
}
相关推荐
drebander3 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
乌啼霜满天2497 分钟前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn12 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟13 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy23 分钟前
高级编程之结构化代码
java·spring boot·spring cloud
弗锐土豆29 分钟前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部
Elaine20239130 分钟前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
小小大侠客1 小时前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext
一二小选手1 小时前
【MyBatis】全局配置文件—mybatis.xml 创建xml模板
xml·java·mybatis
码老白1 小时前
【老白学 Java】Warshipv2.0(二)
java·网络