一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
Java·Stream
1. Stream简介
Stream是JDK1.8引进的一个新的特性,而这个新的特性主要用来处理我们常见的集合中的元素,搭配上lambda表达式,可以让开发的小伙伴减少一定的代码量。
使用Stream之前,我们在脑海中要有几个基本的概念:
- Stream是用来了处理集合中元素的工具,即处理实现了Collection接口中的类。
- 通过对集合使用Stream操作而得到的新集合并不会影响原有集合。即新集合中的元素与原有集合中的元素并不是同一个元素。
2. Stream用法
2.1 构造篇
- Stream.of
应用场景:主动构造Stream
Stream<Integer> stream = Stream.of(13, 28, 69, 87);
- Array.stream
应用场景:已知数组构造Stream
Integer[] integers = new Integer[]{23, 85, 34, 45};
Stream<Integer> stream = Arrays.stream(integers);
- 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三种方法的应用场景供小伙伴们参考。
- 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 +
'}';
}
}
- 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 +
'}';
}
}
- 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的作用发挥出来。
作者:明雄
版权声明:本文为原创文章,未经本人允许不得转载。