本篇接着上篇来, 继续学习java8新特性
Java 8 简明教程
Stream 介绍
Stream (流) 操作算是对集合的大大增强, 很多之前很复杂需要很多代码量的逻辑在此终结.
- 一个Collection(集合)可以通过调用
stream()
和parallelStream()
两个方法获得stream
- stream()方法返回一个
顺序流
, 所有的操作必须等待上一步的完成. - parallelStream()方法返回一个
并行流
, 操作会更高效, 考虑业务使用不同的流.
- 流的操作分为
中间操作
和终止操作
- 中间操作: 对流的处理还在进行中, 不会中指当前流. 可以返回一个流进行其他操作. 就像StringBuffer的append()一样
- 终止操作: 对流的处理将会终结, 当前流将不能继续使用.
中间操作
Filter
Stream<T> filter(Predicate<? super T> predicate);
Filter接收一个 Predicate<? super T>
接口的参数进行过滤操作
Sorted
Stream<T> sorted(Comparator<? super T> comparator);
Stream<T> sorted();
sorted()方法自然排序. 即调用对象本身的compareTo()方法排序.
sorted(Comparator<? super T> comparator); 接受一个 Comparator对象进行排序
Map
<R> Stream<R> 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);
<U> Stream<U> mapToObj(IntFunction<? extends U> mapper);
map有上述几个方法, 可以转换为指定的类型, 方法参数都是接受一个 xxxFunction
的转换器. 下面有一个演示.
list.stream()
.filter(s -> s.startsWith("1"))
.sorted(String::compareTo)
.mapToInt(Integer::valueOf)
.mapToObj(String::valueOf)
.mapToLong(Long::valueOf);
终止操作
Match
boolean anyMatch(Predicate<? super T> predicate);
boolean allMatch(Predicate<? super T> predicate);
boolean noneMatch(Predicate<? super T> predicate);
Match方法有三个, 都接受一个 Predicate
条件来决定返回true or false
Count
long count();
count()计算集合大小, 这个方法很简单.
Reduce
有了Map, 那肯定是有Reduce, 不过Reduce是一个终止操作. 它接收一个 xxxOperator
的操作函数.
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
T reduce(T identity, BinaryOperator<T> accumulator);
Optional<T> reduce(BinaryOperator<T> accumulator);
下面有一个操作的演示.
list.stream()
.sorted((s1, s2) -> s1.compareTo(s2) > 0 ? -1 : 0)
.reduce((i, j) -> i + "#" + j)
.ifPresent(System.out::println);
System.out.println("---------------------------");
final String join = "#";
String joinReduce = list.stream()
.reduce(join, (s1, s2) -> s1 + join + s2);
System.out.println(joinReduce);
所有操作的代码
public static void main(String[] args) {
ArrayList <String> list = new ArrayList <>();
list.add("11");
list.add("12");
list.add("13");
list.add("14");
Comparator<String> comparator = String::compareTo;
Predicate<String> predicate = s -> s.startsWith("1");
IntUnaryOperator intUnaryOperator = i -> i + 1;
ToIntFunction<String> toIntFunction = Integer::valueOf;
IntConsumer consumer = System.out::println;
list.stream()
.filter(predicate)
.sorted(comparator)
.mapToInt(toIntFunction)
.map(intUnaryOperator)
.forEach(consumer);
boolean anyMatch = list.stream()
.filter(s -> s.startsWith("1"))
.sorted(String::compareTo)
.mapToInt(Integer::valueOf)
.mapToObj(String::valueOf)
.mapToLong(Long::valueOf)
.anyMatch(i -> i > 10);
System.out.println(anyMatch);
long count = list.stream().count();
System.out.println(count);
list.stream()
.sorted((s1, s2) -> s1.compareTo(s2) > 0 ? -1 : 0)
.reduce((i, j) -> i + "#" + j)
.ifPresent(System.out::println);
System.out.println("---------------------------");
final String join = "#";
String joinReduce = list.stream()
.reduce(join, (s1, s2) -> s1 + join + s2);
System.out.println(joinReduce);
}