本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
在java8发布以后,增加了很多有意思却又很方便的特性,stream流可以算上其中之一了。使用了它之后,对于集合的处理瞬间变得简洁了许多,接下来让我来带领大家一起看看这个新特性的简洁之处吧。
以下内容是根据个人理解编写,若有错误,请指正。
概念
stream流其实跟io流理解起来差不多,都可以理解为通过将数据转换为流的形式处理数据的。而stream流其实是将特定的元素经过一定的处理包装后变为一个新值并返回。接下来看一个简单的例子:
比如我们要将集合中的小写字母变为大写,不使用stream流的情况下是这么写的:
List<String> list = Arrays.asList("c", "a", "c","b", "c", "c");
List<String> upperList = new ArrayList<>();
for (String s : list) {
upperList.add(s.toUpperCase());
}
这样写很麻烦,而jdk1.8之后我们可以这么写:
List<String> collect2 = list.stream().filter(element -> element.contains("b")).map(String::toUpperCase).collect(Collectors.toList());
一行代码搞定,是不是很方便呢?我们可以通过代码大致看懂:
这段代码大概有三个部分:
第一个部分【.stream()】:将集合转换为stream流(源)
第二个部分【.filter().map()】:处理数据(变换)
第三个部分【.collect()】:收集数据并返回(收集)
我们可以通过下面的图直观的看出来:
接下来我们就根据以上三个部分,分别讲述其方法。
一、创建流
创建一个Java流有许多方式。一旦流被创建了,那么它是无法修改数据源的,所以针对一个数据源我们可以创建多个流。 常见的创建流的方式有:.stream()、Stream.empty()、Stream.Builder()等。不过在开发中我经常使用第一种方式,使用集合的stream()方法可以将该集合直接变为stream流。
还有一种是基本数据类型流: 在Java8中,三种基本类型——int,long,double可以创建对应的流。
1、range()方法
range(int start, int end) 方法会创建一个从start到end的有序流,当然,包头不包尾。
IntStream intStream = IntStream.range(1, 3);//1,2
LongStream longStream = LongStream.rangeClosed(1, 3);//1,2,3
2、of()方法
此方法与上述方法功能一样,但是不是包头不包尾,而是将这些元素作为流的元素
IntStream intStream = IntStream.of(1, 3);//1,3
下班了下班了,明天再写。