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);

 

posted @ 2019-08-26 21:37  君子之行  阅读(1)  评论(0编辑  收藏  举报