Stream流
用来操作数组和集合中的元素,对容器中的元素,进行一系列的流水线式的中间操作,过滤筛选切片,不会对原数据做任何的改变,只是得到一个(持有结果的)新流.
创建Stream串行流,单线程
List<Integer> integers = Arrays.asList(10, 20, 50, 40, 30);
Stream<Integer> stream = integers.stream();//创建Stream流
Stream<Integer> stream2 = Arrays.stream(new Integer[]{5, 4, 3, 2, 1, 0});
Stream<Integer> Stream3 = Stream.of(9, 8, 7, 6, 5, 5, 8);
获取无限流
//Stream.generate(Math::random).forEach(System.out::println);
//Stream.iterate(0, integer -> integer+1).forEach(System.out::println);
打印流中元素
Stream3.forEach(System.out::println);
对流中的元素排序,利用comparator接口,lambda表达式
stream.sorted((o1, o2) -> o1 - o2).forEach(integer -> System.out.print(integer+" "));
跳过元素个数(1)
stream2.skip(1).forEach(System.out::println);
限制元素个数(2)
stream2.limit(2).forEach(System.out::println);
Stream.iterate(0, integer -> integer+1).limit(10).forEach(System.out::println);
去掉重复元素(需要重写元素的Hashcode和equals方法,integer和String默认重写了)
Stream3.distinct().forEach(System.out::println);
提取元素(可以提取引用数据类型的数据),并对其操作(集合中的元素通过流全部变成大写打印,集合本身元素不做任何改变)
List<String> integers2 = Arrays.asList("a", "b", "c", "d");
integers2.stream().map(s -> s.toUpperCase()).forEach(System.out::println);
匹配
1.allMatch 匹配其中所有元素,满足给定条件,返回true
List<Integer> integers = Arrays.asList(10, 20, 30, 40, 50, 60);
Stream<Integer> stream = integers.stream();
boolean b = stream.allMatch(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
if (integer > 5) return true;
else return false;
}
});
System.out.println(b);
2.anyMatch 匹配其中只要有一个满足给定条件,返回true
3.noneMatch 没有一个匹配上给定条件,返回true
查找
1.findFirst() 找第一个
List<Integer> integers = Arrays.asList(10, 20, 30, 40, 50, 60);
Stream<Integer> stream = integers.stream();
Optional<Integer> first = stream.findFirst();
System.out.println(first.get());
2.findAny() 任意找一个
3.max() 找最大值
创建并行流,多线程
Stream<Integer> integerStream = integers.parallelStream();
归约
求和
List<Integer> integers = Arrays.asList(10, 20, 30, 40, 50, 60);
Stream<Integer> stream = integers.stream();
Integer reduce = stream.reduce(0, new BinaryOperator<Integer>() {
@Override
public Integer apply(Integer integer, Integer integer2) {
return integer + integer2;
}
});
System.out.println(reduce);
对引用数据类型可以先提取在归约,map-reduce模式
收集
collect(Collectors.toList())
collect(Collectors.toSet())
collect(Collectors.tocollection(指定集合))
List<Integer> integers = Arrays.asList(10, 20, 30, 40, 50, 60);
Stream<Integer> stream = integers.stream();
List<Integer> collect = stream.skip(1).limit(4).collect(Collectors.toList());
System.out.println(collect);
一些注意事项详见网址
谢谢