①Stream 自己不会存储元素。 ②Stream 不会改变源对象。每次处理都会返回一个持有结果的新Stream。 ③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。 说明:可以把Stream想象成一条流(流水线)在流的上面有很多操作(过滤,转换,排序,.....)
创建StreamAPI
例1:
static List<Integer> list = new ArrayList<>();
static {
list.add(10);
list.add(20);
list.add(15);
list.add(19);
list.add(59);
}
@Test
public void test(){
Stream<Integer> stream = list.stream();
//lambda表达式
stream.forEach(i -> System.out.println(i));
//方法的引用
stream.forEach(System.out::println);
list.stream().forEach(System.out::println);
}
中间操作API
例2:
/*
通过数组创建Stream:
public static <T> Stream<T> stream(T[] array): 返回一个流
*/
@Test
public void test3(){
int[] numbers = {12,89,23,65,32};
Arrays.stream(numbers).forEach(System.out::println);
}
例3:
@Test
public void test(){
Stream<Person> stream = list.stream();
//Stream filter(Predicate p)接收 Lambda , 从流中排除某些元素
Stream<Person> stream2 = stream.filter(new Predicate<Person>() {
@Override
public boolean test(Person person) {//只要分数及格的
return person.score >= 60;
}
});
stream2.forEach(System.out::println);
list.stream().filter(p -> p.score >= 60).forEach(System.out::println);
}
例3:
@Test
static List<Person> list = new ArrayList<>();
public void test3(){
list.stream()
.distinct()//Person重写equals和hashCode方法后是按照内容去重
.limit(2) //获取前2个元素
.forEach(System.out::println);
}
例4:Comparator
@Test
public void test6(){
list.stream()
//.sorted()//自然排序
.sorted(new Comparator<Person>() {//定制排序
@Override
public int compare(Person o1, Person o2) {
return o1.score - o2.score;
}
})
.forEach(System.out::println);
list.stream()
.sorted((o1,o2) -> o1.score - o2.score)
.forEach(System.out::println);
}
终结操作API
终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是 void。流进行了终止操作后,不能再次使用。
1 | boolean | allMatch(Predicate p) | 检查是否匹配所有元素 |
2 | boolean | anyMatch(Predicate p) | 检查是否至少匹配一个元素 |
3 | boolean | noneMatch(Predicate p) | 检查是否没有匹配所有元素 |
4 | Optional<T> | findFirst() | 返回第一个元素 |
5 | Optional<T> | findAny() | 返回当前流中的任意元素 |
6 | long | count() | 返回流中元素总数 |
7 | Optional<T> | max(Comparator c) | 返回流中最大值 |
8 | Optional<T> | min(Comparator c) | 返回流中最小值 |
9 | void | forEach(Consumer c) | 迭代 |
10 | T | reduce(T iden, BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 T |
11 | U | reduce(BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 Optional<T> |
12 | R | collect(Collector c) | 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法 |