一 : Stream流的介绍
stream
不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果;
stream
不会改变数据源,通常情况下会产生一个新的集合;
stream
具有延迟执行特性,只有调用终端操作时,中间操作才会执行。
对stream
操作分为终端操作和中间操作,那么这两者分别代表什么呢?终端操作
:会消费流,这种操作会产生一个结果的,如果一个流被消费过了,那它就不能被重用的。中间操作
:中间操作会产生另一个流。因此中间操作可以用来创建执行一系列动作的管道。一个特别需要注意的点是:中间操作不是立即发生的。相反,当在中间操作创建的新流上执行完终端操作后,中间操作指定的操作才会发生。所以中间操作是延迟发生的,中间操作的延迟行为主要是让流API能够更加高效地执行。
stream
不可复用,对一个已经进行过终端操作的流再次调用,会抛出异常。
java.util.stream.Stream 是Java 8新加入的流接口。(并不是一个函数式接口
)
获取一个流非常简单,有以下几种常用的方式:
所有的 Collection 集合都可以通过 stream 默认方法获取流(顺序流);
所有的 Collection 集合都可以通过parallelStream获取并行流
Stream 接口的静态方法 of 可以获取数组对应的流。
Arrays的静态方法stream也可以获取流
Filter(过滤)
filter()方法接受一个谓词(一个返回boolean值的函数),并返回一个流,其中仅包含通过该谓词的元素。
@Test
public void filter() {
List<String> list = Arrays.asList("name", "age", "password", "address");
List<String> collect = list.stream().filter(item ->
item.length() > 4)
.collect(Collectors.toList());
System.out.println(collect);
System.out.println(list);
}
比如上面那个集合中的值那个的长度大于4
Map(转换)
map()方法可将一个流的元素转换为另一个流。它接受一个函数,该函数映射流中的每个元素到另一个元素。
@Test
public void map() {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> collect = numbers.stream().map(item -> {
item *= 2;
return item;
}).collect(Collectors.toList());
System.out.println(collect);
}
比如,将上面的集合中的值每个*2
Distinct(去重)
distinct()方法从流中返回所有不同的元素。在内部,它使用equals()方法来比较元素是否相同。因此,我们需要确保equals()方法已正确实现。
@Test
public void distinct() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> collect = list.stream().distinct().collect(Collectors.toList());
System.out.println(collect);
}
Limit(限制)
limit()方法可以将流限制为指定的元素数
@Test
public void limit() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> collect = list.stream().limit(10).collect(Collectors.toList());
System.out.println(collect);
}
Skip(跳过)
skip()方法可跳过前N个元素。
@Test
public void Skip(){
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> collect = list.stream().skip(10).collect(Collectors.toList());
System.out.println(collect);
}
forEach(循环)
forEach()方法可将给定的方法应用于流中的每个元素。该方法是一种消费流的方式,不会返回值。
@Test
public void forEach(){
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.stream().forEach(item->{
System.out.println(item);
});
}
Count(计数)
count()方法可以返回流中的元素数。
@Test
public void Count(){
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
long count = list.stream().count();
System.out.println(count);
}