从迭代到流的操作
List<String> words; // words列表中保存某本书中所有单词// 1. 传统方式迭代int count = 0;for(String w : words) {if(w.length() > 12){count++;}}// 2. 使用流long count = words.stream().filter(w -> w.length() > 12).count();
流的创建
- 流创建了只能被操作一次,重新使用会抛出异常
```java
// 初始化数组
String[] strArr = {“hello”, “world”, “test”, “compute”, “red”};
// 将数组转换为 stream 流
Stream
words1 = Stream.of(strArr); Stream words11 = Arrays.stream(strArr); // 将静态数组转换为 stream 流 Stream words2 = Stream.of(“aaa”, “bbb”, “ccc”); // 创建一个不包含任何元素的流 Stream silence = Stream.empty();
Path path = Paths.get(“E:/t1.txt”);
String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
Stream
/ ———————————————无限流——————————————— /
// 获取一个常量值的流
Stream
<a name="cnMZC"></a># 中间操作```java// 初始化一个字符串流Stream<String> strStream = Stream.of("hello", "world", "test", "compute", "red", "hello");// 过滤得到字符串长度大于4的字符串Stream<String> words1 = strStream.filter(w -> w.length() > 4);// 将流中的所有字符串元素转为大写Stream<String> words2 = strStream.map(String::toUpperCase);// 将流中的字符串元素转为每个字母组成的流,然后将其打平Stream<String> words3 = strStream.flatMap(s -> Stream.of(s.split("")));// 从开头保留3个元素Stream<String> words4 = strStream.limit(3);// 从开头舍弃3个元素Stream<String> words5 = strStream.skip(3);// 对流进行升序或降序操作Stream<String> words6 = strStream.sorted();Stream<String> words7 = strStream.sorted(Comparator.reverseOrder());// 去重Stream<String> words8 = strStream.distinct();// 将两个流进行连接Stream<String> words9 = Stream.concat(Stream.of("hello".split("")), Stream.of("world".split("")));
终结操作
约减
// 初始化字符串数组String[] strArr = {"hello", "world", "test", "compute", "red", "hello"};// 获取流中的最大元素Optional<String> result1 = Stream.of(strArr).max(String::compareToIgnoreCase);// 获取流中的最小元素Optional<String> result2 = Stream.of(strArr).min(String::compareToIgnoreCase);// 获取流中的第一个元素Optional<String> result3 = Stream.of(strArr).findFirst();// 获取流中的任意一个元素Optional<String> result4 = Stream.of(strArr).parallel().findAny();// 流中是否存在 h 开头的元素boolean r1 = Stream.of(strArr).anyMatch(s -> s.startsWith("h"));// 流中是否全部元素都以 h 开头boolean r2 = Stream.of(strArr).allMatch(s -> s.startsWith("h"));// 流中是否没有以 s 开头的元素boolean r3 = Stream.of(strArr).noneMatch(s->s.startsWith("s"));
收集结果
Optional类型
创建optional值
// 创建一个空OptionalOptional.empty();// 创建一个具有value值的Optional,如果value为null,则抛出空指针异常Optional.of(T valuel);// 创建一个具有value值的Optional,如果value为null,则创建一个空的OptionalOptional.ofNullable(T value);
获取Optional值
// 创建一个Optional对象Optional<String> result = Optional.ofNullable(string);// 获取Optional对象中的值,如果Optional对象中不存在值,则括号内的值为默认值String str = result.orElse("");// 获取Optional对象中的值,如果Optional对象中不存在值,则执行括号内的匿名函数计算值String str2 = result.orElseGet(String::new);// 获取Optional对象中的值,如果Optional对象中不存在值,则抛出括号内的异常信息String str3 = result.orElseThrow(Exception::new);
消费Optional值
// 初始化一个ListList<String> list = new ArrayList<>(Arrays.asList("aa", "bb", "cc"));// 创建Optional对象Optional<String> result = Optional.ofNullable(string); // string 变量可能为null// 如果Optional不为空,则执行括号内的匿名函数,否则忽略result.ifPresent(list::add);// 如果Optional不为空,则执行括号内的匿名函数,否则调用emptyActionresult.ifPresentOrElse(list::add, emptyAction); // emptyAction的类型为Runnable
