Stream 接口: 支持对一系列元素进行顺序和并行的聚合操作功能接口,是Java8中处理数组、集合的抽象概念。
1 2
| public interface Stream<T> extends BaseStream<T,Stream<T>>
|
1.1 stream 基本操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class TestStream { public static void main(String[] args) { List<String> list = Arrays.asList("zhangsan", "lisi", "wangwu", "zhaoliu", "lucy"); Stream<String> stream = list.stream(); Stream<String> center = stream.filter((s)->s.length()>=5); System.out.println("名字长度>=5的是:"); center.forEach(System.out::println); System.out.println(); list.stream().filter(s->s.length()>=5).forEach(System.out::println); } }
|
1.2 stream 中间操作
常用API: filter limit distinct map sorted
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Stream<T> filter(Predicate<? super T> predicate) 返回由与此给定谓词匹配的此流的元素组成的流。
Stream<T> limit(long maxSize) 返回由此流的元素组成的流,截短长度不能超过 maxSize 。
Stream<T> distinct() 返回由该流的不同元素(根据 Object.equals(Object) )组成的流。
<R> Stream<R> map(Function<? super T,? extends R> mapper) 返回由给定函数应用于此流的元素的结果组成的流。
Stream<T> sorted() 返回由此流的元素组成的流,根据自然顺序排序。
Stream<T> sorted(Comparator<? super T> comparator) 返回由该流的元素组成的流,根据提供的 Comparator进行排序。
|
中间操作示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class TestStreamAPI { public static void main(String[] args) { List<String> list = Arrays.asList("zhangsan", "lisi", "wangwu", "zhaoliu", "zuee", "zhangsan"); System.out.println("--------------filter---------------"); list.stream().filter(s->s.startsWith("z")).filter(s->s.contains("an")).forEach(System.out::println); System.out.println("--------------limit---------------"); list.stream().limit(2).forEach(System.out::println); System.out.println("--------------distinct---------------"); List<String> ls = new ArrayList<String>(); list.stream().distinct().forEach(s->ls.add(s)); ls.stream().forEach(System.out::println); System.out.println("--------------map---------------"); list.stream().map(s->s.toUpperCase()).forEach(System.out::println); list.stream().map(String::toUpperCase).forEach(System.out::println); System.out.println("--------------sorted---------------"); list.stream().sorted().forEach(System.out::println); System.out.println("--------------sorted()---------------"); list.stream().sorted((x,y)->x.charAt(0) - y.charAt(0)).forEach(System.out::println); } }
|
1.3 stream 终止操作
常用API: count forEach anyMatch allMatch noneMatch findFirst findAny min max
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| long count() 返回流中的元素个数。
void forEach(Consumer<? super T> action) 对此流的每个元素执行遍历操作。
boolean anyMatch(Predicate<? super T> predicate) 或,流中是否有包含指定规则的元素
boolean allMatch(Predicate<? super T> predicate) 且,流中是否全部包含指定规则的元素
boolean noneMatch(Predicate<? super T> predicate) 非,流中是否都不包含指定规则的元素
Optional<T> findFirst() 返回流的第一个元素的Optional,如果流为空,则返回一个空的Optional 。
Optional<T> findAny() 返回流的任意一个随机元素的Optional,如果流为空,则返回一个空的Optional 。
Optional<T> max(Comparator<? super T> comparator) 根据提供的 Comparator 返回此流的最大元素。
Optional<T> min(Comparator<? super T> comparator) 根据提供的 Comparator 返回此流的最小元素。
|
终止操作示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public class TestStreamEnd { public static void main(String[] args) { List<String> list = Arrays.asList("changsan", "lisi", "wangwu", "zhaoliu", "zuee"); list.stream().forEach(System.out::println); long count = list.stream().filter(s->s.length()>4).count(); System.out.println("流中长度>4元素个数:" + count); boolean bool1 = list.stream().filter(s->s.length()>4).anyMatch(s->s.startsWith("w")); System.out.println("流中是否是有包含 w 开头的元素:" + bool1); boolean bool2 = list.stream().filter(s->s.length()>4).allMatch(s->s.startsWith("w")); System.out.println("流中是否全是包含 w 开头的元素:" + bool2); boolean bool3 = list.stream().filter(s->s.length()>4).noneMatch(s->s.startsWith("a")); System.out.println("流中是否没有包含 a 开头的元素:" + bool3); String s1 = list.stream().filter(s->s.length()>4).findFirst().get(); System.out.println("流中的第一个元素是:" + s1); String s2 = list.stream().findAny().get(); String s3 = list.parallelStream().findAny().get(); System.out.println("流中的随机1个元素是:" + s2 + " " + s3); String max = list.stream().max((e1, e2)->e1.charAt(0)-e2.charAt(0)).get(); System.out.println("首字母最大的是:" + max); } }
|
串行与并行的 Stream 效率对比:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class TestStreamOther { public static void main(String[] args) { List<String> list = new ArrayList<String>(); for (int i = 0; i < 1000000; i++) { list.add(UUID.randomUUID().toString()); } System.out.println("串行运行时间:"); long start = System.currentTimeMillis(); long count = list.stream().sorted().count(); System.out.println("排序的元素数量:" + count); System.out.println("用时:" + (System.currentTimeMillis() - start)); System.out.println("并行运行时间:"); start = System.currentTimeMillis(); count = list.parallelStream().sorted().count(); System.out.println("排序的元素数量:" + count); System.out.println("用时:" + (System.currentTimeMillis() - start)); } }
|