Stream
说明:
- java 8 中新增
- java.util.stream.Stream 里的类
- 不同于 IO 流
- 针对操作集合(Collection)对象里的数据
- Stream 是并行化的
Stream对象可以调用多个intermediate(转换) 操作, 但只能有一个 terminal 操作; 多个转换操作会在遇到 terminal 操作之后依次执行,即取集合内的一个元素取出后就依次执行, 相当于只需要for循环一次;
流的操作
把一个数据结构包装成 Stream 后,就要开始对里面的元素进行各类操作了。常见的操作可以归类如下。
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
创建对象
函数方法
- map(Function<? super T,? extends R> mapper) 转换对象
- IntStream mapToInt(ToIntFunction<? super T> mapper)
- LongStream mapToLong(ToLongFunction<? super T> mapper)
- DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper) Read more at https://www.pluralsight.com/guides/java-and-j2ee/java-8-stream-api-part-2?gclid=Cj0KEQiAv4jDBRCC1IvzqqDnkYYBEiQA89utohLUUWPqlyGn2Tg2gcDBDe5XZwXsVqpODHmKpfUtPy4aArHz8P8HAQ#2WWEKDQW8Dhjqzt8.99
- flatMap(Function<? super T,? extends Stream<? extends R>> mapper) 一个参数里多个元素
- filter(Predicate<? super T> predicate) 过滤, 返回true的元素才能留下
- forEach() 遍历, 语句里不能修改值,不能终止
- peek() 遍历, 与forEach类似
- reduce() 过滤, 一个起始值(种子),然后依照运算规则(BinaryOperator)
- limit/skip limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素
- sorted() 排序
- min/max 找出最大最小值
- distinct 过滤重复值
- Match Stream 有三个 match 方法,从语义上说:
- allMatch:Stream 中全部元素符合传入的 predicate,返回 true
- anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
- noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true
例子, 来源
// 一
stream .flatMap(l -> l.stream())
.peek(System.out::print) .map(c -> (int)c)
.forEach(i -> System.out.format("%d ", i));
// 二
Stream.of('a', 'b', 'c', 'd', 'e')
.map(c -> (int)c)
.forEach(i -> System.out.format("%d ", i));
// 三
long start = System.nanoTime();
String first = Stream.of("a","b","c","d","e").parallel().findFirst().get();
long duration = (System.nanoTime() - start) / 1000000;
System.out.println(first + " found in " + duration + " milliseconds");