Java Stream流

很方便的一个东西

对于数组的处理肯定会用到 for 循环,不过如果要对一个数组进行多次操作的话,肯定会需要中间数组
而使用 Stream 流的方式,就可以全程只对一个数组进行操作了
就像流水线上生产的物品,Stream 流就是把数组变成一个待加工的物件,每一步操作都对这个流进行操作

创建 Stream 流

创建 Stream 流的方式很简单,List,Set,Map 都有 stream() 方法,可以把组转换为流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();

Set<String> set = new HashSet<>();
Stream<String> stream2 = set.stream();

Map<String, String> map = new HashMap<>();
Set<String> keySet = map.keySet();
Stream<String> stream3 = keySet.stream();

Collection<String> values = map.values();
Stream<String> stream4 = values.stream();

Set<Map.Entry<String, String>> entries = map.entrySet();
Stream<Map.Entry<String, String>> stream5 = entries.stream();

也可以使用 Stream.of() 方法来创建流

1
2
3
4
5
6
7
Stream<Integer> stream1 = Stream.of(1, 2, 3, 4, 5);

Integer[] arr1 = {1,2,3,4,5};
Stream<Integer> stream1 = Stream.of(arr1);

String[] arr2 = {"aba", "kua", "gua"};
Stream<String> stream3 = Stream.of(arr2);

使用 Stream 流

Stream 流可以实现链式编程,有的方法返回的也是 Stream 流
有的返回的不是 Stream 流,这就是终结方法

forEach 方法

遍历整个数组,没有返回值,是终结方法

1
2
3
4
Stream<String> stream = Stream.of("aaa", "bbb", "ccc", "ddd");
stream.forEach((name)-> {
System.out.println("str:" + name);
});

遍历这个流,然后在方法中写入该怎么遍历,可以传入一个 lambda 表达式

count 方法

返回数组的长度,是终结方法

1
2
3
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
long count = stream.count();
System.out.println(count);

filter 方法

过滤数组,返回 Stream 流

1
2
3
4
5
6
7
ArrayList<String> str = new ArrayList<>();
str.add("w t f");
str.add("fuck me");
str.add("what the hell");
str.add("surprise mother fucker");
Stream<String> stream = str.stream();
stream.filter((name) -> {return name.startsWith("w");}).forEach(System.out::println);

调用 filter 方法,里面传入过滤的规则,然后返回过滤后的流,可以继续使用这个流进行链式编程

limit 方法

就是返回数组的前多少个元素组成新的流,返回 Stream 流

1
2
3
4
String[] arr = new String[]{"hello", "world", "cao", "wlg"};
Stream<String> stream = Arrays.stream(arr);
Stream<String> stream1 = stream.limit(2); //只要前两个元素
stream1.forEach(System.out::println);

skip 方法

返回跳过了几个元素后的流,返回 Stream 流

1
2
3
Stream<String> stream = Stream.of("草", "靠", "可恶", "我去");
Stream<String> stream1 = stream.skip(2);
stream1.forEach(System.out::println);

map 方法

对数组进行映射,把一个数组里的元素经过一定规则的映射后,返回映射后的结果,返回 Stream 流

1
2
3
Stream<String> stream = Stream.of("1", "2", "3", "4", "5");
Stream<Integer> stream1 = stream.map(Integer::parseInt);
stream1.forEach(System.out::println);

此处将字符串的数组映射为了 int 类型的数字

concat 方法

将两个 Stream 流合并为一个流,返回 Stream 流

1
2
3
4
Stream<String> stream1 = Stream.of("阿巴阿巴", "外币巴布", "不拉布拉");
Stream<String> stream2 = Stream.of("hello", "world", "gdi", "btw");
Stream<String> concat = Stream.concat(stream1, stream2);
concat.forEach(System.out::println);

看了看文档,Stream 流有很多方法可以使用,这里只是几个常用的方法,还有很多东西要学呢
Java 的 api 怎么这么难学啊 Σ(▼□▼メ)