Java集合--Stream数据流

内容学习于:edu.aliyun.com


前言:

  数据流是从JDK 1.8的时候提供的一种快速 的数据处理能力,其主要是工作在类集.上,在JDK 1.8开始之后Collection接口里面追加了两个新的方法:

  • 并行数据流计算: public default Stream parallelStream();
  • 数据流计算: public default Stream stream();

  所有的流计算都使用Stream进行描述。

1. Stream基础操作

  流的计算主要是避免迭代操作所造成的性能浪费,也就是说对于数据的处理使用Stream性能更高,它的主要设计还是为了大数据分析准备的。

Stream基本操作:

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        List<String> all  = new ArrayList<>();
        Collections.addAll(all,"Java","JavaScript","Ruby","Python","Go");
        Stream<String> stream = all.stream();// 将数据转变成数据流
        System.out.println(stream.filter(ele->ele.toLowerCase().startsWith("j")).count());
}
}

结果:

2

  对于此时的代码,暂时不要通过技术的思想去思考,只是关注于代码的简洁性,简洁性的确是非常高的。
  以上的操作只是针对于给定的集合数据实现了简单的处理统计,但是如果有需要也可以进行子集合截取。

将数据分割成新的集合:

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        List<String> all  = new ArrayList<>();
        Collections.addAll(all,"Java","JavaScript","Ruby","Python","Go");
        Stream<String> stream = all.stream();// 将数据转变成数据流
        List<String> subList = stream.filter(ele->ele.toLowerCase().startsWith("j")).collect(Collectors.toList());
        System.out.println(subList);
    }
}

结果:

[Java, JavaScript]

  在进行数据处理的时候如果未加任何的限制,所有的数据的筛选和处理都是从头一直处理到结尾的,如果有需要也可以进行部分数据的处理操作,可以使用Stream提供的两个方法:

  • 设置取出的最大数据量: public Stream limit(long maxSize);
  • 跳过多少数据量: public Stream skip(long m)。

实现部分数据处理:

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        List<String> all  = new ArrayList<>();
        Collections.addAll(all,"Java","JavaScript","Ruby","Python","Go");
        Stream<String> stream = all.stream();// 将数据转变成数据流
        List<String> subList = stream.filter(ele->ele.toLowerCase().startsWith("j")).skip(1).limit(3).collect(Collectors.toList());
        System.out.println(subList);
    }
}

结果:

[JavaScript]

流就是简化处理操作,同时结合Lambda实现简单的数据分析处理。

2. MapReduce模型

  在JDK1.8里面除Steam之外实际上,还针对于Google提出的分布式数据计算模型进行了实现,而这个模型就称为MapReduce,实际上这个标盘有两个处理阶段:

  • Map处理:对数据进行各种的先期处理,例如,可能需要进行计算,或者其它的转型等;
  • Reduce 处理:数据的统计计算,针对于处理好的数据内容进行统计操作。

使用Stream实现MapReduce模型:

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        List<Order> all = new ArrayList<>();
        all.add(new Order("佩奇猪娃娃", 19.8, 200));
        all.add(new Order("辛博娃娃", 0.8, 200));
        all.add(new Order("成成娃娃", 32000.8, 20));
        all.add(new Order("Java学习", 98.8, 200));
        DoubleSummaryStatistics statistics = all.stream().filter(ele -> ele.getName().contains("娃娃")).mapToDouble(orderObject -> orderObject.getCount() * orderObject.getPrice()).summaryStatistics();
        System.out.println("【购买数量】:" + statistics.getCount());
        System.out.println("【总花销】:" + statistics.getSum());
        System.out.println("【最高价格】:" + statistics.getMax());
        System.out.println("【最低价格】:" + statistics.getMin());
        System.out.println("【平均价格】:" + statistics.getAverage());
    }
}

结果:

【购买数量】:3
【总花销】:644136.0
【最高价格】:640016.0
【最低价格】:160.0
【平均价格】:214712.0

  这类的操作理论上都应该交由数据分析人员的实现,但是随着技术的发展,数据分析也早晚都是你的事。

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务