Softeware_programming_Java_Stream
21:10:00
1.
Optional<T> 容器类, 代表一个值存在与否
1. isPresent(): optional 存在值时返回true, 否则返回 false
2. ifPresent(Consumer<T> block) 会在值存在的时候执行给定的代码块,(Consumer接口:传递一个T参数,
消费这个 T 什么也不返回)
3. T get() : 值存在时返回值,否则抛出一个 NoSuchElement 异常
4. T orElse(T other) : 会在值存在时返回值, 否则返回一个默认值
2.
流操作: 无状态 和 有状态
map 或 filter 等操作会从输入流种获取每一个元素, 并在输出流得到0或1个结果。,这些操作一般都是无状态的:他们没有内部状态
reduce, sum, max,min 等操作需要内部状态累计结果,不管流中有多少元素要处理,内部状态都是有界的。
sort 或 distinct 等操作一开始都和 filter, map 差不多--都是接受一个流,再生成一个流,中间操作,
但是有一个关键的区别,从流种排序和删除重复项时都需要知道先前的历史,我们把这些操作叫做有状态操作。
中间操作:filter, distinct, skip, limit, map, flatMap, sorted.
终端操作:anyMatch, noneMatch, allMatch, findAny, findFirst, forEach, collect, reduce,count
原始类型流特化
Java8 引入了三个原始类型特化流接口来解决这个问题:IntStream, DoubleStream, LongSteam, 分别将流中的元素特化为
int, long 和 double, 从而避免了暗含的装箱成本。
1 映射到数值流
将流转换为特化版本的常用方法是 mapToInt, mapToDouble 和 mapToLong, 不是返回 Stream<T>
int sum = transactions.stream().mapToInt(Transaction::getValue).sum();
mapToInt 返回一个 IntStream 而不是 Stream<Integer> ,然后就可以调用IntStream中的 sum方法,
如果流是空的,sum默认返回0, 还支持其他方法如 max, min, average
2 转换回 对象流 boxed 方法
3 默认值 OptionalInt
三中原始流特化, 分别有一个 Optional 原始类型特化版本: OptionalInt, OptionalDouble, OptinalLong
OptionalInt max = transaction.stream().mapToInt(Transaction::getValue).max()
如果没有最大值可以给个默认值
int i = transactions.stream().mapToInt(Transaction::getValue).max().orElse(1);
构建流
1. Stream.of 显示构建流,任意数量的参数
2.由数组构建流 Arrays.Stream , 参数为数组
int[] nums = {2,3,4,5,6};
IntStream stream = Arrays.stream(nums);
3 由文件生成流
Files.lines 可以从文件得到一个流,其中的每个元素都是该文件的一行
Stream<String> lines = Files.lines(Paths.get("/users/files/data.xml"), Charset.defaultCharset());
lines.forEach(xxx);