zoukankan      html  css  js  c++  java
  • Java流式处理

    基本介绍

    在java8之前,很多时候我们都需要获取到集合底层的数据,将其进行处理后在返回,而j这种情况都需要我们自己来Iterator遍历。

    受到函数式编程的影响,java8以后新增的java.util.stream包中的类提供了Stream API,以支持对元素流进行函数式操作。

    Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操作,例如查找、过滤、分组、排序等一系列的操作。

    并且有串行、并行两种执行模式,并行模式充分的利用了多核处理器的优势,使用fork/join框架进行了任务拆分,同时提高了执行速度。

    使用流式操作大大方便了我们对集合的处理,并且增强了代码的可读性。

    常用操作

    获取流的方法

    通过集合获取:java8中的Collection提供了两个获取流的方法:

    • default Stream<E> stream() :获取串行流
    • default Stream<E> parallelStream():获取并行流

    通过数组获取:使用Arrays的静态方法stream

    • static<T> Stream<T> stream(T[] array)

    也可通过Stream接口本身提供的generate方法和of方法来获取流,这里就不加赘述了。

    中间操作

    中间操作也就是操作的返回值仍为流的操作

    先创建一个list

    List<Integer> list = new ArrayList<>();
    list.add(10);
    list.add(35);
    list.add(165);
    list.add(76);
    list.add(234);
    list.add(13);
    
    • filter(): 对元素进行过滤

    如果要筛选出大于30小于100的元素。

    普通操作

    for (Integer integer : list) {
        if (integer>30 && integer<100){
            System.out.println(integer);
        }
    }
    

    流式操作

    list.stream().filter(item -> item>30&&item<100).forEach(System.out::println);
    

    这样操作即简单,每一步的目的也一目了然。

    • sorted():对元素排序

    将list元素从大到小排序

    普通操作

    Collections.sort(list, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1-o2;
        }
    });
    System.out.println(list);
    

    流式操作

    list.stream().sorted((o1,o2)-> o1-o2).forEach(System.out::println);
    
    • map():元素映射

    将元素中的每一个数变为原来的2倍

    普通操作

    for (int i = 0; i < list.size(); i++) {
        list.set(i,list.get(i)*2);
    }
    for (Integer integer : list) {
        System.out.println(integer);
    }
    

    流式操作

    list.stream().map(item-> item=item*2).forEach(System.out::println);
    
    • distinct():去除重复的元素
    List<Integer> temp = new ArrayList<>(list.size());
    for (Integer integer : list) {
        if (!temp.contains(integer)) {
            temp.add(integer);
        }
    }
    list.clear();
    list.addAll(temp);
    System.out.println(list);
    

    流式操作

    list.stream().distinct().forEach(System.out::println);
    
    • limit():对元素进行截断

    流式操作

    list.stream().limit(3).forEach(System.out::println);
    
    • skip():跳过前面几个元素

    流式操作

    list.stream().skip(3).forEach(System.out::println);
    

    最终操作

    • forEach():遍历每个元素。

    上面已经使用过了forEach,事实上,上面的写法是一种简写,完整的写法如下

    list.stream().forEach(a-> System.out.println(a));
    
    • reduce():把Stream 元素组合起来。例如,字符串拼接,数值的 sum,min,max ,average 都是特殊的 reduce。

    将元素累加,流式操作

    System.out.println(list.stream().reduce((a, b) -> a + b).get());
    
    • collect():返回一个新的集合。

    返回一个Set,流式操作

    list.stream().collect(Collectors.toSet()).forEach(System.out::println);
    
    • min():找到最小值。
    System.out.println(list.stream().min((o1, o2) -> o1 - o2).get());
    
    • max():找到最大值。
    System.out.println(list.stream().max((o1, o2) -> o1 - o2).get());
    

    上面是以List作为演示,其他容器基本都一致,不过Map类型需要先调用entrySet()方法在进行如上处理。

  • 相关阅读:
    .net知识和学习方法系列(二十)CLR委托
    Asp.net用户管理API的应用(上)
    .net知识和学习方法系列(十七)CLRCLR中的值类型和引用类型
    .net知识和学习方法系列(十九)CLR事件
    Internet Explorer 8 Beta2 常见问题解答
    关于设计模式
    Extjs中ComboBox加载并赋初值
    WPF获取窗体元素
    Extjs使用extend(js继承)
    Extjs解决上传图片预览
  • 原文地址:https://www.cnblogs.com/ylcc-zyq/p/12865992.html
Copyright © 2011-2022 走看看