流与集合有以下几种不同:
- 有存储。 流不是存储元素的数据结构; 相反,它通过计算操作的流水线传送诸如数据结构,阵列,生成器功能或I / O通道的源的元件。
- 功能性质。 流上的操作产生结果,但不会修改其来源。 例如,过滤从原
Stream
获得的Stream会将不需要过滤的元素生成新的Stream
,而不是从源集合中删除元素。
- 懒惰操作。 许多流操作(如过滤,映射或重复删除)可以懒惰地实现,从而暴露优化的机会。
- 大小无限。 虽然集合的大小有限,但流不没有大小的限制
- 消耗品。 流的元素只能在流的生命周期中访问一次。 像
Iterator
一样 ,必须生成一个新流来重新访问元素。
public class Test{
public static void main(String[] arg) throws Exception{
//java8中流的常用操作
String[] array = {"a","b","c","d","e","f","g","h"};
//注意:为什么这里不先定义一个stream(下面这样定义)然后在下面需要用到Arrays.stream(array) 地方用stream直接代替呢?
//因为stream和Iterator一样属于“消耗品” 只能用一次,不能重复使用,除非你生成一个新的流
//Stream<String> stream = Arrays.stream(array);
//boolean allMatch(Predicate<? super T> predicate) 此流的所有元素是否满足predicate表达式
System.out.println(Arrays.stream(array).allMatch(e->e instanceof String));//true
//boolean anyMatch(Predicate<? super T> predicate) 此流的任一元素是否满足predicate表达式
System.out.println(Arrays.stream(array).anyMatch(e->e == "a"));//true
//collect(Collector<? super T,A,R> collector) 能将流生成Collection<E>
List<String> list = Arrays.stream(array).collect(Collectors.toList());
System.out.println(list);//[a, b, c, d, e, f, g, h]
//long count() 返回此流中的元素数
System.out.println(Arrays.stream(array).count());//8
//Stream<T> filter(Predicate<? super T> predicate) 返回一个新流,新流中的元素为 原流中满足predicate条件的元素
List<String> list2 = Arrays.stream(array).filter(e->e!="a").collect(Collectors.toList());
System.out.println(list2);//[b, c, d, e, f, g, h]
//void forEach(Consumer<? super T> action) 对此流的每个元素执行操作
Arrays.stream(array).forEach(e->System.out.println(e));
/*********************下面的方法就不举例了*************************/
//Stream<T> distinct() 将流中相同的元素只保留一个,然后返回一个新流
//创建一个懒惰连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素
//Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
//Optional<T> max(Comparator<? super T> comparator) 根据提供的 Comparator返回此流的最大元素
//Optional<T> min(Comparator<? super T> comparator) 根据提供的 Comparator返回此流的最小元素
//Stream<T> sorted() 返回由此流的元素组成的流,根据自然顺序排序
//Object[] toArray() 返回一个包含此流的元素的数组。
//Stream<T> limit(long maxSize) 返回由此流的元素组成的流,截短长度不能超过 maxSize
}
}