Stream

案例:ZJJ_JavaBasic_2019/10/30_11:52:13_nnxww


Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。
使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

流 (Stream) 到底是什么呢 ?
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,流讲的是计算! ”

注意:
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

性能问题


http://note.youdao.com/noteshare?id=d236f18a2c26d40eff793da2cff003f2

5. 创建方式

案例:ZJJ_JavaBasic_2019/10/30_14:51:07_5pxda
@Test
public void ceui1() {
//1. Collection 提供了两个方法 stream() 与 parallelStream()
ArrayList list = new ArrayList<>();
Stream stream = list.stream();
Stream stringStream = list.parallelStream();//并行流(多线程操作的)

}

//2. 通过 Arrays 中的 stream() 获取一个数组流 @Test
public void ceui2() {

Integer[] nums = new Integer[10];
Stream stream1 = Arrays.stream(nums);
}

@Test
public void ceui3() {
//3. 通过 Stream 类中静态方法 of()
Stream stream2 = Stream.of(1, 2, 3, 4, 5, 6);

}

@Test
public void ceui4() {
//4. 创建无限流 两种方式 //迭代 Stream stream3 = Stream.iterate(0, (x) -> x + 2).limit(10);
stream3.forEach(System.out::println);

//生成 Stream stream4 = Stream.generate(Math::random).limit(2);
stream4.forEach(System.out::println);

}



a)筛选与切片


filter——接收 Lambda , 从流中排除某些元素。
limit——截断流,使其元素不超过给定数量。
skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
distinct——筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素

案例:ZJJ_JavaBasic_2019/10/30_15:41:09_c5k7w

b)映射

案例:ZJJ_JavaBasic_2019/10/30_15:49:00_69l3b

Stream其它 - 图1

//提取名字出来

/这两个效果是一样的/
Stream stringStream1 = transactions.stream()
.map(transaction ->
transaction.getTrader().getName()
);
stringStream1.forEach(System.out::println);

System.out.println(“—————————————————-“);

Stream stringStream = transactions.stream()
.map(transaction ->
{
String name = transaction.getTrader().getName();
return name;
}
);
stringStream.forEach(System.out::println);



c)排序

  • sorted()——自然排序
    sorted(Comparator com)——定制排序
    案例:ZJJ_JavaBasic_2019/10/30_16:14:43_5fxff

    d)查找与匹配

    | 案例:ZJJ_JavaBasic_2019/10/30_17:43:55_dybqm
    | | —- |


    allMatch——检查是否匹配所有元素
    anyMatch——检查是否至少匹配一个元素
    noneMatch——检查是否没有匹配的元素
    findFirst——返回第一个元素
    findAny——返回当前流中的任意元素
    count——返回流中元素的总个数
    max——返回流中最大值
    min——返回流中最小值

    e)终止操作


    Stream其它 - 图2

    f)归约

    | 案例:ZJJ_JavaBasic_2019/10/30_18:06:44_k8aq7
    | | —- |


    reduce(T iden , BinaryOperator b) 可以将流中元素反复结合起来,得到一个值.返回T
    reduce(BinaryOperator b) 可以将流中元素反复结合起来,得到一个值.返回Optional

    g)收集

案例:ZJJ_JavaBasic_2019/10/30_18:34:05_ftv1z



Stream其它 - 图3
Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、Set、Map)。但是 Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例如下表:

Stream其它 - 图4
Stream其它 - 图5