很方便的一个东西
对于数组的处理肯定会用到 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 怎么这么难学啊 Σ(▼□▼メ)