Stream流式编程
这是 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
就是这么一个过程。
接着,Stream
与lambda
表达式是配合使用的。
为了让大家更好的使用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
流式编程其实还有很多其他的功能,我在这里展现的只是九牛一毛。
今天就到这里~
求知若饥,虚心若愚。我们下次再见~