Stream流式编程

243 阅读2分钟

这是 Java 8 的另外一个新特性,Stream 的出现在笔者认为更像是 Java 随着时代的发展在进步,大数据的发展促使了 Java 的进步以及 Stream 流式编程的出现。

Stream出现之前,如果我们想要遍历一个集合并对其进行操作的话,一般是用for循环或者是iterator迭代器。Stream与前面的iterator的功能一样,其实就是遍历整个集合,不过Stream提供了更多的API,使开发者可以更方便的在程序的内存中处理数据。

为了代码演示方便,这里创建一个Apple实体

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Apple {
    private String name;
    private int weight;
}

现在有如下需求:

  • 给你一个装有苹果实体的集合,给我取出名字为"A"的苹果,并打印出来
public static void main(String[] args) {
    List<Apple> apples = Arrays.asList(
        new Apple("A", 30),
        new Apple("B", 20),
        new Apple("C", 60));
    // 不使用 Stream
    for (Apple apple : apples) {
        if ("A".equals(apple.getName())) {
            System.out.println(apple);
        }
    }
    // 使用 Stream 简化代码
    apples.stream().
        filter(a -> "A".equals(a.getName())).
        forEach(System.out::println);
}

可以看到,代码长度虽然一致,但代码表达的语义更加清晰了。

这时大家可能还是会有疑惑,我压根看不懂下面的代码啊,怎么能说代码表达能力更强了呢。

这个时候就该解释一下Stream的含义了,前面讲过Stream是一个更加高级的遍历,其实我们也可以把它想象成一条河,所有的数据都在这条河里面流淌,一旦你处理过后(水溜走了),就不会再回到原来的地方,我们操作Stream就是这么一个过程。

接着,Streamlambda表达式是配合使用的。

为了让大家更好的使用Stream,这里对Stream常用的API进行演示

public static void main(String[] args) {
    List<Apple> apples = Arrays.asList(
        new Apple("A", 30),
        new Apple("B", 20),
        new Apple("C", 60));
    
    // 中间操作 filter,取出名字为"A"的苹果,并打印出来
    apples.stream().
        filter(a -> "A".equals(a.getName())).
        forEach(System.out::println);
    // 结果:Apple(name=A, weight=30)
    
    // 中间操作 map,将所有苹果的名字都变为小写,并打印结果
    apples.stream().
        map(a -> a.getName().toLowerCase()).
        forEach(System.out::println);
    // 结果:a,b,c
    
    // 终止操作 count,计算链表中重量大于 25 的苹果的数量
    long count = apples.stream().
        filter(a -> a.getWeight() > 25).
        count();
    System.out.println(count);
    // 结果:2
    
    // 终止操作 min,找到重量最小的苹果
    System.out.println(apples.stream().
                       min((a1, a2) -> a1.getWeight() - a2.getWeight()).
                       get().getName());
    结果:B
    
    // 终止操作 max
    System.out.println(apples.stream().
                       min((a1, a2) -> a2.getWeight() - a1.getWeight()).
                       get().getName());
    结果:C
}

到这里,Stream流式编程的入门就算是结束了,Stream流式编程其实还有很多其他的功能,我在这里展现的只是九牛一毛。

今天就到这里~

求知若饥,虚心若愚。我们下次再见~