java8新特性回顾(二)---stream api

接下来聊聊stream api

1.外部迭代和内部迭代

for (Shape shape : shapes) {
  shape.setColor(RED);
}


* 外部迭代: for-each、for、while等外部迭代方式缺点;
Java 的 for 循环是串行的,而且必须按照集合中元素的顺序进行依次处理;
集合框架无法对控制流进行优化,例如通过排序、并行、短路(short-circuiting)求值以及惰性求值改善性能。

shapes.forEach(s -> s.setColor(RED));


* 内部迭代: 
只负责 做什么,而把 怎么做 留给类库。用户把对操作的控制权交还给类库,并向类库传递迭代时所需执行的代码,从而允许类库进行各种各样的优化(例如乱序执行、惰性求值和并行等等)


2.stream(流)

流(Stream) 是 Java SE 8 类库中新增的关键抽象,它被定义于 java.util.stream
无存储:流并不存储值;流的元素源自数据源(可能是某个数据结构、生成函数或 I/O 通道等等),通过一系列计算步骤得到;
天然的函数式风格(Functional in nature):对流的操作会产生一个结果,但流的数据源不会被修改;
惰性求值:多数流操作(包括过滤、映射、排序以及去重)都可以以惰性方式实现。这使得我们可以用一遍遍历完成整个流水线操作,并可以用短路操作提供更高效的实现;
无需上界(Bounds optional):不少问题都可以被表达为无限流(infinite stream):用户不停地读取流直到满意的结果出现为止(操作无限流时我们必需使用短路操作,以确保操作可以在有限时间内完成);

3.流水线

数据源—惰性操作—......—惰性操作—终止操作 
创建一个Stream
在一个或多个步骤中,指定将初始Stream转换为另一个Stream的中间操作。
使用一个终止操作来产生一个结果。该操作会强制它之前的延迟操作立即执行。在这之后,改stream不会再被使用了。




4.Stream source

生成方式:
Collection.stream() 或 Collection.parallelStream()
Arrays.stream(T array)  或 Stream.of()
java.io.BufferedReader.lines()
java.util.stream.IntStream.range()
java.nio.file.Files.walk()
java.util.Spliterator
Random.ints()
BitSet.stream()
Pattern.splitAsStream(java.lang.CharSequence)
JarFile.stream()
Stream.generate()


5.流的操作:

常见的操作可以归类如下
Intermediate
map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered
Terminal:
forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator
Short-circuiting:
anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit


5.1 Stream Api — map/flatMap:把 input Stream 的每一个元素,映射成 output Stream 的另外一个元素




5.2.filter:filter 对原始 Stream 进行某项测试,通过测试的元素被留下来生成一个新 Stream。




5.3 foreach:forEach 方法接收一个 Lambda 表达式,然后在 Stream 的每一个元素上执行该表达式。
forEach 是 terminal 操作。因此它执行后,Stream 的元素就被“消费”掉了



5.4 findFirst/findAny:这是一个 termimal 兼 short-circuiting 操作,它总是返回 Stream 的第一个元素,或者空。
它的返回值类型:Optional<T>。它或者表示一个对T对象的封装,或者表示不是任何对象。
Optional<T>比一般的T类型引用更安全,因为它不会是null。



5.5 reduce:Optional<T> reduce(BinaryOperator<T> accumulator);
T reduce(T identity, BinaryOperator<T> accumulator);
reduce方法的主要作用是把 Stream 元素组合起来。它提供一个起始值(种子),然后依照运算规则(BinaryOperator),和前面 Stream 的第一个、第二个、第 n 个元素组合。从这个意义上说,字符串拼接、数值的 sum、min、max、average 都是特殊的 reduce。




5.6 limit/skip:limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素。属于Short-circuiting操作




5.7 sorted:对 Stream 的排序通过 sorted 进行。




5.8 min/max/distinct:min 和 max 的功能是求最大最小值
也可以通过对 Stream 元素先排序,再 findFirst 来实现,但前者的性能会更好,为 O(n),而 sorted 的成本是 O(n log n)。
distinct 用来找出不重复的单词





5.9 Match操作

Stream 有三个 match 方法,从语义上说:
allMatch:Stream 中全部元素符合传入的 predicate,返回 true
anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true
它们都不是要遍历全部元素才能返回结果。例如 allMatch 只要一个元素不满足条件,就 skip 剩下的所有元素,返回 false。





5.8 可变集合操作

集合上的流操作一般会生成一个新的值或集合。不过有时我们希望就地修改集合。
java8为集合(例如 Collection,List 和 Map)提供了一些新的方法以便于在集合上进行修改。例如: 

Iterable.forEach(Consumer)
Collection.removeAll(Predicate)
List.replaceAll(UnaryOperator)
List.sort(Comparator)
Map.computeIfAbsent(K key,
            Function<? super K, ? extends V> mappingFunction)
ConcurrentMap.merge(K key, V value,
            BiFunction<? super V, ? super V, ? extends V> remappingFunction)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值