Lamda的深入认知(七)

主题:流的操作

一、建立:

  1. 数组创建:
        //由数组生成流
        String[] array=new String[]{"a","b","c"};
        Stream<String> stream1=Arrays.stream(array);
  1. Collection创建
        //由集合生成的流
        Collection<String> collection=new ArrayList<>();
        Stream<String> stream2=collection.stream();
  1. 函数创建
       //由函数生成的无限流
        Stream<Double> stream3=Stream.iterate(Double.valueOf(10),m->Math.random()*m);
        Stream<Double> stream4= Stream.generate(()->Math.random());
  1. 文件创建:
        //由文件生成流
        try(Stream<String> stream5=Files.lines(Paths.get("abc.txt"), Charset.defaultCharset())){
            stream5.forEach(s-> System.out.println(s));
        }catch (IOException e){ }

二、 筛选:

  1. 原型:中间操作
Stream<T> filter(Predicate<? super T> predicate);
  1. demo:
        Arrays.asList(3,9,1,8)
                .stream()
                .filter(i->i>5);

三、 切片:

  1. 原型:中间操作
    Stream<T> skip(long n);
    Stream<T> limit(long maxSize);
  1. demo:
        Arrays.asList(3,9,1,8)
                .stream()
                .skip(1)
                .limit(2);

四、映射:

* 普通映射
  1. 原型:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
  1. demo:
        Arrays.asList(3,9,1,8)
                .stream()
                .map(i->"string:"+i);
* 扁平化映射:
  1. 原型:中间操作
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

说明:它的操作分为两个步骤

  • 第一步将流中每个元素转化成为stream(不可以转变成为“原始值Stream”)
  • 第二步:将上步得到的若干个Stream合并成为一个Stream
  1. demo: 把若干个字符串遍历出来
  • 一次性转化方案
        Arrays.asList("abc","bcd")
                .stream()
                .flatMap(s->Arrays.stream(s.split("")))
                .forEach(s-> System.out.println(s));
  • 两步转化方案
        Arrays.asList("abc","bcd")
                .stream()
                .map(s->s.split(""))
                .flatMap(ary->Arrays.stream(ary))
                .forEach(s-> System.out.println(s));

五、查找、匹配、统计、遍历

  1. 原型:终端操作
Optional<T> findFirst();
Optional<T> findAny();
boolean noneMatch(Predicate<? super T> predicate);
boolean allMatch(Predicate<? super T> predicate);
boolean anyMatch(Predicate<? super T> predicate);
long count();
void forEach(Consumer<? super T> action);
void forEachOrdered(Consumer<? super T> action);

六、reduce操作:

  1. 原型:终端操作
T reduce(T identity, BinaryOperator<T> accumulator);
Optional<T> reduce(BinaryOperator<T> accumulator);
 <U> U reduce(U identity,
                 BiFunction<U, ? super T, U> accumulator,
                 BinaryOperator<U> combiner);
  1. demo:
        //求和
        int m=Arrays.asList(4,1,3,9,8)
                .stream()
                .reduce(0,(prev,current)->prev+current);

        //考虑到stream为空的情况
        int m1=Arrays.asList(4,1,3,9,8)
                .stream()
                .reduce((prev,current)->prev+current)
                .get();
        //类型转换操作后的求和
        Integer m2=Arrays.asList("4","1","7","9","8")
                .stream()
                .reduce(Integer.valueOf(0),(prev,current)->prev+Integer.valueOf(current),(a,b)->0);

七、排序

  1. 原型:
Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);
  1. demo:
    略...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。