Java·Stream

116 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

Java·Stream

1. Stream简介

Stream是JDK1.8引进的一个新的特性,而这个新的特性主要用来处理我们常见的集合中的元素,搭配上lambda表达式,可以让开发的小伙伴减少一定的代码量。

使用Stream之前,我们在脑海中要有几个基本的概念:

  1. Stream是用来了处理集合中元素的工具,即处理实现了Collection接口中的类。
  2. 通过对集合使用Stream操作而得到的新集合并不会影响原有集合。即新集合中的元素与原有集合中的元素并不是同一个元素。

2. Stream用法

2.1 构造篇

  1. Stream.of

应用场景:主动构造Stream

Stream<Integer> stream = Stream.of(13, 28, 69, 87);
  1. Array.stream

应用场景:已知数组构造Stream

Integer[] integers = new Integer[]{23, 85, 34, 45};
Stream<Integer> stream = Arrays.stream(integers);
  1. Collection.stream

应用场景:已知集合构造Stream

List<Integer> integerList = new ArrayList<>();

integerList.add(1);
integerList.add(32);
integerList.add(89);

Stream<Integer> stream = integerList.stream();

2.2 应用篇

透过上面的构造篇我们已经知道如何构建出一个Stream对象,但是Stream的构建方式并不止上文所提到的方式,上文仅列举出开发中常用的几种方式而已。
应用篇这里主要讲述filter,map以及flatmap三种方法的应用场景供小伙伴们参考。

  1. filter

应用场景:根据条件筛选出所需的集合元素

/**
 * @Description: 案例一:使用filter获取获取peopleList中的成年人
 * @Author: mingxiong
 * @Date: 2022/4/10 17:54
 */
public class Demo1 {
  private static final List<People> peopleList = new ArrayList<>();

  static {
    peopleList.add(new People("Amy", 17));
    peopleList.add(new People("Jack", 37));
    peopleList.add(new People("Otto", 26));
    peopleList.add(new People("Fluke", 14));
    peopleList.add(new People("Tommy", 15));
  }

  /**
   * @Description 获取peopleList中的成年人
   */
  public static void main(String[] args) {
    List<People> adults = peopleList
      .stream()
      .filter(people -> people.getAge() >= 18)
      .collect(Collectors.toList());

    System.out.println(adults);
  }
}

class People {
  private String name;
  private Integer age;

  public People() {
  }

  public People(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "People{" +
      "name='" + name + ''' +
      ", age=" + age +
      '}';
  }
}
  1. map

应用场景:将集合中的元素映射成新的元素

/**
 * @Description: 案例二:使用map获取获取studentList中的所有人的名称
 * @Author: mingxiong
 * @Date: 2022/4/10 17:54
 */
public class Demo2 {
  private static final List<Student> studentList = new ArrayList<>();

  static {
    studentList.add(new Student(1, "Irving", 17));
    studentList.add(new Student(1, "Kobe", 37));
    studentList.add(new Student(1,"James", 26));
    studentList.add(new Student(1, "Dunham", 14));
    studentList.add(new Student(1, "Fores", 15));
  }

  /**
   * @Description 获取studentList中的所有人的名称
   */
  public static void main(String[] args) {
    List<String> nameList = studentList
      .stream()
      .map(Student::getName)
      .collect(Collectors.toList());

    System.out.println(nameList);
  }
}

class Student {
  private Integer sex;
  private String name;
  private Integer age;

  public Student() {
  }

  public Student(Integer sex, String name, Integer age) {
    this.sex = sex;
    this.name = name;
    this.age = age;
  }

  public Integer getSex() {
    return sex;
  }

  public void setSex(Integer sex) {
    this.sex = sex;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "Student{" +
      "sex=" + sex +
      ", name='" + name + ''' +
      ", age=" + age +
      '}';
  }
}
  1. flatmap

应用场景:针对于集合中的元素是集合类型的集合,其作用主要是对将集合中的元素(此元素为集合类型)进行展开

/**
 * @Description: 案例三:使用flatmap获取获取peopleList中的名称
 * @Author: mingxiong
 * @Date: 2022/4/13 11:01
 */
public class Demo3 {
  private static final List<List<String>> peopleList = new ArrayList<>();

  static {
    List<String> familyMembersList1 = new ArrayList<>();
    List<String> familyMembersList2 = new ArrayList<>();
    List<String> familyMembersList3 = new ArrayList<>();

    familyMembersList1.add("Jerry");
    familyMembersList1.add("Flake");
    familyMembersList2.add("Amy");
    familyMembersList2.add("Dum");
    familyMembersList3.add("Kobe");
    familyMembersList3.add("Monte");
    peopleList.add(familyMembersList1);
    peopleList.add(familyMembersList2);
    peopleList.add(familyMembersList3);
  }

  /**
   * @Description 获取peopleList中的名称
   */
  public static void main(String[] args) {
    List<Object> allPeopleList = peopleList.stream()
      .flatMap(Collection::stream)
      .collect(Collectors.toList());

    System.out.println(allPeopleList);
  }
}

除了上述的方法之外,还有其他方法,如sorted,peek,limit,distinct以及skip等,这里仅列出常用的三种应用场景,其他方法的应用场景就不一一进行叙述。

3. Stream总结

Stream的出现确实解决了小伙伴们在开发时的某些问题,但是也要避免编写代码时嵌套层次过多的问题,按照一定的标准进行开发,这样才能将Stream的作用发挥出来。


作者:明雄

版权声明:本文为原创文章,未经本人允许不得转载。