4、Stream API
4.1、Stream API定义
Stream API(流)是java8中处理集合的关键抽象概念,是一个数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。执行复杂的查找、过滤和映射数据等操作。使用Stream API对集合或数组数据进行操作,提供了一种高效且易于使用的处理数据的方式。
tips:
-
Stream不会对元素进行存储;
-
Stream不会改变数据源(源对象),执行相关操作后返回一个持有结果的新Stream流;
-
Stream操作是延迟执行,只有需要结果的时候才会执行。
4.2、Stream API 的使用
3步骤:
-
a、创建Stream流(利用数据源(数组、集合等)获取一个流)
-
b、中间操作
-
c、终止操作
4.2.1、创建Stream流
4种方式:
-
通过Collection中的Stream()和paralleStream()方法获取 集合流
-
通过Arrays中的stream()方法获取 数组流
-
通过stream中的of()方法获取流 可以接受同一类型的任意数量的参数
-
通过stream中的iterate()和generate()方法获取 无限流
代码示例:
package com.lt.StreamDemo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.junit.Test;
public class TestStream {
/**
* 创建Stream流
*/
@Test
public void Test1() {
//方式1: 通过Collection中的Stream()和paralleStream()方法获取 集合流
List<String> list=new ArrayList<String>();
Stream<String> stream1=list.stream(); //获取顺序流
Stream<String> stream2=list.parallelStream(); //并行流
//方式2: 通过Arrays中的stream()方法获取 数组流
int[] int1=new int[16];
IntStream stream3=Arrays.stream(int1);
//方式3: 通过stream中的of()方法获取流 可以接受同一类型的任意数量的参数
Stream<String> stream4=Stream.of("阿波罗","波赛东","盖亚");
//方式4: 通过stream中的iterate()和generate()方法获取 无限流
Stream.iterate(2, (x) -> x*(x+1)).limit(6).forEach(System.out::println); //迭代
Stream.generate(Math::random).limit(6).forEach(System.out::println); //生成
/**
* 以下涉及到中间操作和终端操作,这里不做深究,后面笔记会进一步说明
*/
List<Double> stream5=Stream.generate(Math::random).limit(8).collect(Collectors.toList());
System.out.println(stream5);
}
}
4.2.2、中间操作
1、中间操作符:
API方法 | 作用 |
---|---|
filter() | 接受Lambda表达式,从Stream流中排出某些元素 |
limit() | 截断Stream流,使其元素不超过给定数量 |
distinct() | 筛选,通过Stream流所产生元素的hashCode()和equals()去除重复的元素 |
skip(n) | 跳过元素,返回一个扔掉前n个元素的流 |
sorted() | 对数据进行排序 |
map() | 将Stream流映射成另外一种数据 |
2、代码示例:
package com.lt.StreamDemo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.junit.Test;
import com.lt.entity.Student;
public class TestStream {
/**
*中间操作符示例
*/
@Test
public void Test2() {
//filter()示例
List<String> list=Arrays.asList("张飞","赵云","关羽","黄忠","马超","黄忠","张飞");
list.stream().filter((x) -> x.contains("关羽")).forEach(System.out::println);
System.out.println("=====================");
//limit()示例1
list.stream().distinct().forEach(System.out::println);
System.out.println("=====================");
//limit()示例2
List<Student> list1=new ArrayList<Student>();
list1.add(new Student("赵云",18));
list1.add(new Student("马超",19));
list1.add(new Student("吕布",21));
list1.add(new Student("关羽",19));
list1.add(new Student("张飞",20));
list1.add(new Student("貂蝉",17));
// list1.stream().distinct().forEach(System.out::println);
/**
* 当使用distinct()方法时,所产生元素的hashCode()和equals()去除重复的元素
*/
List<Student> stu=list1.stream().distinct().collect(Collectors.toList());
System.out.println(stu);
System.out.println("=====================");
//limit()示例
list.stream().limit(4).forEach(System.out::println);
System.out.println("=====================");
//skip()示例
list.stream().skip(2).forEach(System.out::println);
System.out.println("=====================");
//sorted()示例
list1.stream().sorted((x,y) -> Integer.compare(x.getAge(),y.getAge())).forEach(System.out::println);
System.out.println("=====================");
//map()示例
list1.stream().map(Student::getAge).forEach(System.out::println);
System.out.println("=====================");
}
}
4.2.3、终止操作
1、终止操作符
API方法 | 作用 |
---|---|
forEach() | 遍历数据源(集合、数组等)中的元素 |
min() | 求数据源(集合、数组等)的元素中的最小值 |
max() | 求数据源(集合、数组等)的元素中的最大值 |
count() | 计算数据源(集合、数组等)的元素个数 |
reduce() | 规约 可以把所有数据相加 |
collect() | 收集并将数据整合成list集合 或者set集合 |
2、代码示例
package com.lt.StreamDemo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.junit.Test;
import com.lt.entity.Student;
public class TestStream {
/**
* 终止操作符
*/
@Test
public void Test3() {
//定义一个List集合存放多个实体对象
List<Student> list=new ArrayList<Student>();
list.add(new Student("法海",20));
list.add(new Student("小青",19));
list.add(new Student("白素贞",20));
list.add(new Student("许仙",22));
list.add(new Student("连翘",21));
//forEach()示例
list.stream().forEach(System.out::println);
System.out.println("========================");
//min()示例
Optional<Student> min=list.stream().min((x,y) -> Integer.compare(x.getAge(), y.getAge()));
System.out.println(min.get());
System.out.println("========================");
//max()示例
Optional<Student> max=list.stream().max((x,y) -> Integer.compare(x.getAge(), y.getAge()));
System.out.println(max.get());
System.out.println("========================");
//count()示例
long l1=list.stream().count();
System.out.println(l1);
System.out.println("========================");
//reduce()示例
Optional<Integer> reduce=list.stream().map(Student::getAge).reduce((x,y) -> x+y);
System.out.println(reduce);
System.out.println("========================");
//collect()示例
List<String> list1=list.stream().map(Student::getName).collect(Collectors.toList());
for (String str : list1) {
System.out.println(str);
}
}
}