Stream流概述
Stream流是一个来自数据源的元素队列,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)。Stream流里面元素形成一个队列。 Java中的Stream并不会存储元素,而是根据条件过滤出所需要的集合。
数据源流的来源。可以是集合,数组等。
Stream流的三类方法
获取Stream流
创建一条流水线,并把数据放到流水线上准备进行操作
中间方法
流水线上的操作。
一次操作完毕之后,还可以继续进行其他操作。
终结方法
一个Stream流只能有一个终结方法
是流水线上的最后一个操作
Stream流的获取方法
单列集合
可以使用Collection接口中的默认方法stream()生成流
default Stream<E> stream()
双列集合
间接的生成流
可以先通过keySet或者entrySet获取一个Set集合,再获取Stream流
数组
Arrays中的静态方法stream 生成流
同种数据类型的多个数据
1,2,3,4,5….
“aaa”,“bbb”,“ccc”….
使用Stream.of(T…values)生成流
Stream流的常见中间操作方法
Stream<T> filter(Predicate predicate):用于对流中的数据进行过滤
Predicate接口中的方法boolean test(T t):对给定的参数进行判断,返回一个布尔值
Stream<T> limit(long maxSize):截取指定参数个数的数据
Stream<T> skip(long n):跳过指定参数个数的数据
static <T> Stream<T> concat(Stream a, Stream b):合并a和b两个流为一个流
Stream<T> distinct():去除流中重复的元素。依赖(hashCode和equals方法)
Stream流的常见终结操作方法
void forEach(Consumer action):对此流的每个元素执行操作
Consumer接口中的方法void accept(T t):对给定的参数执行此操作
long count():返回此流中的元素数
下面举几个例子
/**
* 需求:过滤元素并遍历集合
* 定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10将集合中的奇数删除,只保留偶数。
* @param args
*/
@Test
public void EvenNumber() {
List<Integer> number=new ArrayList<>();
for (int i=1;i<=10;i++){
number.add(i);
}
Stream<Integer> integerStream = number.stream();
List<Integer> integerList = integerStream.filter(integer -> integer % 2 == 0).collect(Collectors.toList());
System.out.println(integerList);
}
/**
*随机生成10个10至20之间的随机数(数字允许重复),使用Stream流的技术,找出大于15的元素并打印出来;
*/
@Test
public void RandomNumber(){
List<Integer> numbers=new ArrayList<>();
Random random = new Random();
int r;
for (int i = 0; i < 10; i++) {
r=random.nextInt(11)+10;
numbers.add(r);
}
Stream<Integer> randomStream = numbers.stream();
/*System.out.println(randomStream.filter(t -> t > 15).count());*/
//count()(stream终结方法)使用后就不能使用其他的方法
List<Integer> randomList = randomStream.filter(t -> t > 15).collect(Collectors.toList());
System.out.print("大于15的数有:");
System.out.println(randomList);
}