Java8新特性:流式计算

1. 什么是流式计算

大数据的计算模式主要分为:

  • 批量计算 (batch computing)
  • 流式计算 (stream computing)
  • 交互计算 (interactive computing)
  • 图计算 (graph computing) 等

其中,流式计算和批量计算是两种主要的大数据计算模式,分别适用于不同的大数据应用场景
流式计算,顾名思义,就是对数据流进行处理,是实时计算

2. Java中对于流式计算的实现

所在包: java.util.stream
应用场景:主要是对 集合数据 进行操作,其很多操作方法和sql的作用和类似
常用的一些方法:

  • filter(对数据进行过滤)
  • map(对数据进行映射操作)
  • limit(限制数据条数)
  • count(求取数据量)
  • sorted(排序)
  • collect (收集集合)

3. 代码演示

package com.xjs.xjsliving;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: 谢家升
 * @Version: 1.0
 * <p>
 * 演示 Stream API / 流式计算
 */
public class TestStream {
    public static void main(String[] args) {
        //创建5个 Person对象
        Person person1 = new Person(1, "a", 18);
        Person person2 = new Person(2, "b", 12);
        Person person3 = new Person(3, "c", 30);
        Person person4 = new Person(4, "d", 88);
        Person person5 = new Person(5, "e", 22);

        //放入到 list 集合
        List<Person> list = Arrays.asList(person1, person2, person3, person4, person5);
        System.out.println("list= " + list);
        //list= [Person{id=1, name='a', age=18, cat=null}, Person{id=2, name='b', age=12, cat=null}, Person{id=3, name='c', age=30, cat=null}, Person{id=4, name='d', age=88, cat=null}, Person{id=5, name='e', age=22, cat=null}]

        /**
         * 演示 filter
         * 需求:从 list 中过滤出 person.id % 2 != 0 的对象
         *
         * 解读:
         * 1. list.stream() 把 list 转成 流对象,目的是为了使用流的方法 => 这样就可以处理一些比较复杂的业务
         * 2. filter() 传入的是 Predicate -断言 ,要求返回 boolean
         * 3. collect() 传入 Collector 将数据收集到 集合-list2
         * 4. map 操作:希望给 过滤得到的 Person对象 加入 Cat对象
         * 5. sorted 操作 传入 Comparator
         */

        List<Person> list2 = list.stream().filter(person -> {
            return person.getId() % 2 != 0;
        }).map(person -> { //希望给 过滤得到的 Person对象 加入 Cat对象
            Cat cat = new Cat(person.getId() + 100, "小花猫", "花色");
            person.setCat(cat);
            return person;
        }).sorted((p1, p2) -> {
            //return p1.getId() - p2.getId(); //按照 id 升序排列
            //return p2.getId() - p1.getId(); //按照 id 降序排列
            return p2.getAge() - p1.getAge(); //按照 年龄 降序排列
        }).collect(Collectors.toList());

        //细节说明:
        //1. 如果只有 filter ,sorted 操作,不会对原来的 list 产生影响
        //2. 如果有了 map 操作,就会对原来的 list 集合数据产生影响
        System.out.println("list2= " + list2);
        System.out.println("list= " + list);
        //list2= [Person{id=1, name='a', age=18, cat=Cat{id=101, name='小花猫', color='花色'}}, Person{id=3, name='c', age=30, cat=Cat{id=103, name='小花猫', color='花色'}}, Person{id=5, name='e', age=22, cat=Cat{id=105, name='小花猫', color='花色'}}]
        //list= [Person{id=1, name='a', age=18, cat=Cat{id=101, name='小花猫', color='花色'}}, Person{id=2, name='b', age=12, cat=null}, Person{id=3, name='c', age=30, cat=Cat{id=103, name='小花猫', color='花色'}}, Person{id=4, name='d', age=88, cat=null}, Person{id=5, name='e', age=22, cat=Cat{id=105, name='小花猫', color='花色'}}]

        //============ 这里还有几个常用的 Stream API ============
        /**
         * limit 使用
         * 需求:显示 list 集合的前两个
         */
        list.stream().limit(2).forEach(person -> { //遍历输出
            System.out.println(person);
        });

        /**
         * count 使用
         */
        long count = list.stream().count();
        System.out.println("count= " + count); //count= 5

        /**
         * 先 filter 再 count
         */
        long count2 = list.stream().filter(person -> {
            return person.getAge() > 20;
        }).count();
        System.out.println("count2= " + count2); //count= 3

    }
}

//Person类 - entity
class Person {
    private Integer id;
    private String name;
    private Integer age;
    private Cat cat;

    public Person(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", cat=" + cat +
                '}';
    }
}

//猫类
class Cat {
    private Integer id;
    private String name;
    private String color;

    public Cat(Integer id, String name, String color) {
        this.id = id;
        this.name = name;
        this.color = color;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}

4. Java中对于流式计算的实现的本质

按照流式计算的定义,其实我们普通的编程操作 (即普通的对数据的处理也是流式计算),只是语言对这样的操作进行了封装,使其用起来更为简便,所以才特意称其这一部分为 “Java中对于流式计算的实现”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本项目经测试过,真实可靠,请放心下载学习。这两个技术在大数据处理和Java Web开发中扮演着重要的角色。在此次总结中,我将回顾我所学到的内容、遇到的挑战和取得的进展。 首先,我开始了对Spark的学习。Spark是一个强大的分布式计算框架,用于处理大规模数据集。通过学习Spark,我了解了其基本概念和核心组件,如RDD(弹性分布式数据集)、Spark SQL、Spark Streaming和MLlib等。我学会了使用Spark编写分布式的数据处理程序,并通过调优技巧提高了程序的性能。在实践过程中,我遇到了一些挑战,比如调试复杂的数据流转和处理逻辑,但通过查阅文档和与同学的讨论,我成功地克服了这些困难。最终,我能够使用Spark处理大规模数据集,并通过并行化和分布式计算加速任务的执行。 其次,我开始了对Spring Boot的学习。Spring Boot是一种快速构建基于Spring框架的应用程序的方式。通过学习Spring Boot,我了解了其核心思想和基本原理,以及如何构建RESTful Web服务、使用数据库、进行事务管理等。我学会了使用Spring Boot快速搭建Java Web应用程序,并且能够运用Spring Boot的特性来简化开发流程。在学习的过程中,我遇到了一些挑战,比如配置文件的理解和注解的正确使用,但通过查阅官方文档和阅读相关书籍,我逐渐解决了这些问题。最终,我能够独立地使用Spring Boot开发Web应用程序,并运用其优秀的特性提高了开发效率。 总结来说,本学期我在Spark和Spring Boot方面取得了一定的进展。通过学习Spark,我掌握了分布式数据处理的基本原理和技巧,并通过实践应用到了大规模数据集的处理中。通过学习Spring Boot,我了解了现代化的Java Web开发方式,并通过实践构建了一些简单的Web应用程序。我还意识到在学习过程中遇到的困难和挑战是正常的,通过不断的努力和学习,我能够克服这些困难并取得进步。 在未来,我计划继续深入学习Spark和Spring Boot,扩展我的技术栈,提高自己的技能水平。我希望能够运用所学到的知识解决实际问题,并在项目中发挥作用。此外,我也希望能够不断拓宽自己的技术视野,学习其他相关的技术和框架,以便能够适应不同的项目需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要学就学灰太狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值