Stream流
1. 什么是Stream?
Java8中两个最为重要特性:第一个的是Lambda表达式,另一个是Stream API。
StreamAPI它位于 java.util.stream 包中,StreamAPI帮助我们更好地对数据进行集合操作,它本质就是 对数据的操作进行流水线式处理,也可以理解为一个更加高级的迭代器,主要作用是遍历其中每一个元素。
简而言之,StreamAP提供了一种高效且易于使用的处理数据方式。
2. Stream特点:
1、Stream自己不会存储数据。
2、Stream不会改变源对象。相反,它们会返回一个持有结果的新Stream对象
3、Stream操作时延迟执行的。这就意味着它们等到有结果时候才会执行。
3. Stream操作的三个步骤
1、创建Stream:一个数据源(例如:set 、list),获取一个流。
2、中间操作:一个中间操作连接,对数据源的数据进行处理。
3、终止操作:一个终止操作,执行中间操作连,产生结果。
4. Stream创建可以通过三种方式创建。
1. 通过 java.util.Collection.stream() 方法用集合创建流
2. 使用 java.util.Arrays.stream(T[ ] array) 方法用数组创建流
3. 使用 Stream 的静态方法: of()、iterate()、generate()
//1.通过 `java.util.Collection.stream()` 方法用集合创建流
List<String> list = Arrays.asList("d","a", "b", "c");
Stream<String> streamList = list.stream();
System.out.println("###############顺序流##############");
streamList.forEach(System.out::print);
System.out.println();
System.out.println("###############并行流##############");
// 创建一个并行流
Stream<String> parallelStream = list.parallelStream();
parallelStream.forEach(System.out::print);
System.out.println();
//2.使用`java.util.Arrays.stream(T[] array)`方法用数组创建流
int[] array={1,3,5,6,8};
IntStream streamint = Arrays.stream(array);
streamint.forEach(System.out::print);
System.out.println();
//3.使用`Stream`的静态方法:`of()、iterate()、generate()
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
stream.forEach(System.out::print);
System.out.println();
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::print);
System.out.println();
Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::print);
System.out.println();
5. 中间操作
用下面这个集合来举例:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰","张无
忌");
}
(1).limit(n) 从list中取出n个元素
list.stream().limit(2).forEach(System.out::println);
(2).skip(n) 从list第n个元素开始,取出所有元素
list.stream().skip(3).forEach(System.out::println);
(3).distinct() 去除重复
list.stream().distinct().forEach(System.out::println);
(4).filter(Predicate predicate) 筛选条件括号中的内容为一个断言型函数式接口,其中的T为当前集合中元素的类型。
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person("欧阳雪",18,"中国",'F'));
personList.add(new Person("Tom",24,"美国",'M'));
personList.add(new Person("Harley",22,"英国",'F'));
personList.add(new Person("向天笑",20,"中国",'M'));
personList.add(new Person("李康",22,"中国",'M'));
personList.add(new Person("小梅",20,"中国",'F'));
personList.add(new Person("何雪",21,"中国",'F'));
personList.add(new Person("李康",22,"中国",'M'));
}
找出年龄大于20的人并打印输出:
personList.stream()
.filter((person)->person.getAge()>20)
.forEach(System.out::println);
(5).map(Function mapper ) 将元素转换成其他形式或提取信息。
打印出集合中所有人的年龄:
personList.stream()
.map((person -> person.getAge()))
.forEach(System.out::println);
(6).sorted() 对元素进行排序