重温java知识(三十六、类集框架之二十一:Stream)

Stream是从JDK8之后提供的一种数据流的分析操作标准,可以利用其与Lambda表达式结合进行数据统计操作。

1、使用Stream进行数据采集的例子:

package com.mydemo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

public class StreamDemo {
    public static void main(String[] args) {

        // 实例化List集合
        List<String> all = new ArrayList<>();

        // 集合数据保存
        Collections.addAll(all, "java", "sql", "nginx", "tomcat", "html", "css", "js");

        // 获取Stream接口对象
        Stream<String> stream = all.stream();

        /**
         * 将每一个元素全部变为小写字母,
         * 而后查询是否存在字母"j",
         * 如果存在则进行个数统计
         */
        System.out.println(stream.filter(
                (e) -> e.toLowerCase().contains("j")
                ).count()
        );

    }

}

运行结果:
2

MapReduce是一种分布式计算模型,最初由谷歌提出,主要用于搜索领域,解决海量数据的计算问题。在MapReduce模型中一共分为两个部分:

  • map(数据处理)
  • reduce(统计计算)

2、使用Stream实现MapReduce数据分析的例子:

package com.mydemo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.DoubleSummaryStatistics;
import java.util.List;

public class StreamDemo {
    public static void main(String[] args) {

        /**
         * 如果要想使用Stream进行分析处理,
         * 则一定要将全部要分析的数据保存在集合中
         */
        List<Order> all = new ArrayList<>();

        // 集合数据保存
        Collections.addAll(all, new Order("y商品1", 20.00, 5));
        Collections.addAll(all, new Order("y商品2", 50.00, 55));
        Collections.addAll(all, new Order("商品3", 60.00, 35));
        Collections.addAll(all, new Order("y商品4", 70.00, 25));
        Collections.addAll(all, new Order("y商品5", 90.00, 15));

        /**
         * 分析购买商品中带有"y"的数据信息,
         * 并且进行商品单价和数量的处理,
         * 随后分析汇总
         *
         * 在jdk8中,有summaryStatistics()流方法,
         * 我们可以根据此方法获取到集合中的最大值,最小值,和,平均值信息。
         */
        DoubleSummaryStatistics statistics = all.stream().filter(
                // 数据过滤
                (e) -> e.getName().toLowerCase().contains("y")
        ).mapToDouble(          // 获取订单数据
                (orderObject) -> orderObject.getPrice() * orderObject.getAmount()
        ).summaryStatistics();  // 获取统计对象

        System.out.println("购买数量:" + statistics.getCount());
        System.out.println("购买总价:" + statistics.getSum());
        System.out.println("平均花费:" + statistics.getAverage());
        System.out.println("最高花费:" + statistics.getMax());
        System.out.println("最低花费:" + statistics.getMin());
    }

}

class Order {
    private String name;
    private double price;
    private int amount;

    /**
     * 三参构造方法
     *
     * @param name
     * @param price
     * @param amount
     */
    public Order(String name, double price, int amount) {
        this.name = name;
        this.price = price;
        this.amount = amount;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }
}

运行结果:
购买数量:4
购买总价:5950.0
平均花费:1487.5
最高花费:2750.0
最低花费:100.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值