流与集合有以下几种不同:
- 有存储。 流不是存储元素的数据结构; 相反,它通过计算操作的流水线传送诸如数据结构,阵列,生成器功能或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 } }