从迭代到流的操作
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值
// 创建一个空Optional
Optional.empty();
// 创建一个具有value值的Optional,如果value为null,则抛出空指针异常
Optional.of(T valuel);
// 创建一个具有value值的Optional,如果value为null,则创建一个空的Optional
Optional.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值
// 初始化一个List
List<String> list = new ArrayList<>(Arrays.asList("aa", "bb", "cc"));
// 创建Optional对象
Optional<String> result = Optional.ofNullable(string); // string 变量可能为null
// 如果Optional不为空,则执行括号内的匿名函数,否则忽略
result.ifPresent(list::add);
// 如果Optional不为空,则执行括号内的匿名函数,否则调用emptyAction
result.ifPresentOrElse(list::add, emptyAction); // emptyAction的类型为Runnable