统一返回对象封装和统一异常捕获封装springboot starter

好久没有更新文章了,高龄开发没什么技术,去了外包公司后没怎么更新文章了。今天分享下统一处理starter,相信开发web系统的时候都是会涉及到前后端的交互,而后端返回数据的时候一般都会统一封装一个返回对象和统一处理异常,一般情况下都是在controller的每个方法中调用封装的对象,把相应的数据塞到data字段,然后返回给前端。而异常处理则是抛出某个业务异常,然后利用spring切面进行拦截处理。每个项目都需要做这些重复的动作,所以我把这个处理封装成了starter,下面介绍已下这个starter的使用,最后给出git库供大家学习交流。

添加依赖

添加统一处理依赖

<dependency>  
    <groupId>io.gitee.javalaoniu</groupId>  
    <artifactId>jud-springboot-starter</artifactId>  
    <version>0.0.1</version>  
</dependency>

启用统一处理

添加 @EnableUnifiedDisposal 注解

import io.gitee.javalaoniu.jud.annotation.EnableUnifiedDisposal;  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
  
@EnableUnifiedDisposal  
@SpringBootApplication  
public class JudDemoApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(JudDemoApplication.class, args);  
    }  
}

拦截的处理

像平常一样返回数据即可,不需要做其它

import io.gitee.javalaoniu.jud.annotation.IgnoreResponseAdvice;  
import io.gitee.javalaoniu.jud.common.Result;  
import io.gitee.javalaoniu.jud.exception.BusinessException;  
import io.gitee.javalaoniu.jud.exception.ExceptionCode;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
import java.util.ArrayList;  
import java.util.List;  
  
@RestController  
public class DemoController {  
  
    @GetMapping("test1")  
    public String stringTest() {  
        return "hello";  
        // {"code":200,"data":"hello","succ":true,"ts":1673943672244}
    }  
  
    @GetMapping("test2")  
    public String stringNullTest() {  
        return null;  
        // {"code":200,"data":"","succ":true,"ts":1673943691844}
    }  
  
    @GetMapping("test3")  
    public Object objectEntityTest() {  
        DemoEntity demoEntity = new DemoEntity();  
        demoEntity.setName("张三");  
        demoEntity.setAge(50);  
        demoEntity.setSex(false);  
        demoEntity.setSalary(4500000001542.26);  
        return demoEntity;  
        // {"succ":true,"ts":1673943709119,"data":{"name":"张三","age":50,"sex":false,"salary":4.50000000154226E12},"code":200,"msg":null}
    }  
  
    @GetMapping("test4")  
    public Object objectNotNullTest() {  
        return "hello Object";  
        // {"code":200,"data":"hello Object","succ":true,"ts":1673943726435}
    }  
  
    @GetMapping("test5")  
    public Object objectNullTest() {  
        return null;  
        // 啥也没返回,但是如果配置了json转换器的话会返回:{"code":200,"data":null,"succ":true,"ts":1673943726435}
    }  
  
    @GetMapping("test6")  
    public List<DemoEntity> listTest() {  
        DemoEntity demoEntity2 = new DemoEntity();  
        demoEntity2.setName("张三");  
        demoEntity2.setAge(50);  
        demoEntity2.setSex(false);  
        demoEntity2.setSalary(4500000001542.26);  
  
        DemoEntity demoEntity = new DemoEntity();  
        demoEntity.setName("张三");  
        demoEntity.setAge(50);  
        demoEntity.setSex(false);  
        demoEntity.setSalary(4500000001542.26);  
  
        List<DemoEntity> list = new ArrayList<>();  
        list.add(demoEntity);  
        list.add(demoEntity2);  
  
        return list;  
        // {"succ":true,"ts":1673943797079,"data":[{"name":"张三","age":50,"sex":false,"salary":4.50000000154226E12},{"name":"张三","age":50,"sex":false,"salary":4.50000000154226E12}],"code":200,"msg":null}
    }  
  
    @GetMapping("test7")  
    public List<String> listNullTest() {  
        return null;  
        // {"succ":true,"ts":1673943819382,"data":null,"code":200,"msg":null}
    }  
  
    @GetMapping("test8")  
    public Result resultTest() {  
        DemoEntity demoEntity = new DemoEntity();  
        demoEntity.setName("张三");  
        demoEntity.setAge(50);  
        demoEntity.setSex(false);  
        demoEntity.setSalary(4500000001542.2656564545);  
        return Result.success(demoEntity);  
        // {"succ":true,"ts":1673943832081,"data":{"name":"张三","age":50,"sex":false,"salary":4.500000001542266E12},"code":200,"msg":null}
    }  
  
    @IgnoreResponseAdvice  
    @GetMapping("test9")  
    public String ignoreResponseTest() {  
        return "IgnoreResponseAdvice";  
        // IgnoreResponseAdvice
    }  
  
    @GetMapping("test10")  
    public String businessExceptionTest() {  
        throw new BusinessException(ExceptionCode.EXCEPTION);  
        // {"succ":false,"ts":1673943862588,"data":null,"code":500,"msg":"服务器开小差,请稍后再试(Internal Server Error)"}
    }  
}

不拦截处理

对不需要统一处理的controller或者方法使用下面注解

@IgnoreResponseAdvice  
@GetMapping("test9")  
public String ignoreResponseTest() {  
	// 在方法上使用,直接返回IgnoreResponseAdvice字符串给前端
    return "IgnoreResponseAdvice";  
}

可以看到,使用统一处理starter后,统一返回对象和统一异常处理不需要自己在处理,非常方便。
git仓库地址:http://gitee.com/javalaoniu/javalaoniu-jud

本文转载于网络 如有侵权请联系删除

相关文章

  • istio kiali 内部介绍

    一、kiali组件分析使用如下命令查看kialipod详情:kubectl edit pod -n istio-system $(kubectl get pods -n istio-system | grep -i kiali | awk '{print $1}')复制 kialipod内只有一个容器,名称为kiali。该容器在启动的过程中会运行容器内kiali进程,该进程会加载/kiali-configuration/config.yaml配置文件,该config.yaml文件定义了kiali进程运行时行为。pod部分详情如下:spec:   containers:   - command:     - /opt/kiali/kiali     - -config     - /kiali-configuration/config.yaml     - -v     - "3"复制kialipod内/kiali-configuration/config.yaml配置文件是通过挂载configmap获取到的,如下:    volumeMounts

  • LeetCode刷题DAY 34:跳水板

    1题目描述用两种尺寸的木板建造跳水板,尺寸分别为longer和shorter,一共使用k块,求可以得到的所有跳水板长度,并由小到大排序。如:shorter=1,longer=2,k=3,最后结果为[3,4,5,6]。2题解思路:数学计算一共使用k块木板,所以如果longer使用了i块,那么shorter就使用k-i块,基于这样的基本思路可知,本题可以在线性时间内完成,并且用的shorter块数越多,整体跳水板长度越短,因此在计算时shorter个使用个数从k开始逐次递减,可避免之后的排序操作。除上述基本情况外还要考虑两种特殊情况,一是当k=0,则返回空,二是当shorter=longer,则返回的结果为shorter*k(longer*k)。classSolution: defdivingBoard(self,shorter:int,longer:int,k:int)->List[int]: s=[] ifk==0: returns foriinrange(0,k+1): s.append(longer*i+shorter*(-i+k)) s=list(set(s)) s.sor

  • Flutter你竟是这样的布局

    对于Flutter学习者来说,掌握Flutter的布局行为,直接决定了开发者在布局的时候是否能做到高效、快速的开发,但是初学者面对茫茫多的Widget以及各种无法预料的布局行为,总是很难将心中所想,转化为Flutter的代码。 本文翻译整理自https://flutter.dev/docs/development/ui/layout/constraintsLimitations由于上述布局规则,Flutter的布局引擎具有一些重要限制: Widget只能在其父级赋予的限制内决定其自身大小。 这意味着Widget通常不能具有所需的任何大小。 布局是自上而下,当前widget会有基本的一些约束(来自它的父元素),主要是关于宽高的最小值和最大值Widget无法知道也不决定其在屏幕上的位置,因为Widget的父级决定小部件的位置。 它会依次询问子元素关于布局的基本限制要求,让子元素上报期望的布局结果,然后根据现状和自己布局算法的特点,告诉子元素应该放到那儿,占多大空间由于父级的大小和位置又取决于其父级,因此在不考虑整个树的情况下就无法精确定义任何小部件的大小和位置。每个widget不一定会得到

  • STM32 移植FreeModbus详细过程

    modbus是一个非常好的串口协议(当然也能用在网口上),它简洁、规范、强大。可以满足大部分的工业、嵌入式需求。这里详细说下如何将freemodbus移植到stm32平台。我之前下载的版本是1.5,当前官网最新的版本是1.6。两者差别不大,这里以1.5版本做演示。1下载下载好之后,解压得到如下内容:我们需要的是modbus这个文件夹,和demo->BARE下的port文件夹。2准备一个STM32的工程文件夹在工程文件夹下新建一个文件夹:FreeModbus。将第一步获取的两个文件夹放到里面。打开工程,添加两个group,名字分别为modbus和port。将这两个文件夹下的C文件都添加进来,tcp相关的除外。文件包含路径,也添加这几个文件夹的位置:3完善portserial.c文件该文件就是modbus通信中用到的串口的初始化配置文件。我这里选择usart1,波特率9600.第一次打开这个文件,内容如下:void vMBPortSerialEnable(BOOLxRxEnable,BOOLxTxEnable) { } BOOL xMBPortSerialInit(UCHARuc

  • 你的聊天机器人是否符合GDPR?代理设计中的开放性问题(CS CY)

    会话代理为人类互动和无处不在的参与打开了新的机会。随着他们的对话能力和知识的提高,这些代理已经开始可以访问其用户群上越来越多的个人身份信息和详细信息。根据像《通用数据保护条例》(GeneralDataProtectionRegulation,GDPR)一样强大的法规,这种访问方式提出了关键问题。本文探讨了其中的一些问题,目的是在对话代理设计中定义相关的开放性问题。我们希望这项工作能引起对构建代理的进一步研究,这些构建代理对用户交互有效,同时也要遵守法规和用户隐私。原文题目:IsyourchatbotGDPRcompliant?Openissuesinagentdesign原文:Conversationalagentsopentheworldtonewopportunitiesforhumaninteractionandubiquitousengagement.Astheirconversationalabilitiesandknowledgehasimproved,theseagentshavebeguntohaveaccesstoanincreasingvarietyofperson

  • 从Java Socket非阻塞到Netty入门流程

    本博客猫叔的博客,转载请申明出处 阅读本文约“4分钟” 适读人群:同学 JavaIO,Socket非阻塞通信流程这里我们使用一个内嵌的永久循环,来让Socket成为一个非阻塞的通信流程。如上图所示,ServerSocket是我们自建的一个类,通过启动线程,且线程内置一个真循环,防止accept阻塞;在客户端监听类上,将监听到的socket作为参数,传递到客户端监听类上,并再次启动线程,获取一个InputStream,同时再次在这个刚刚启动线程内置一个真循环,为的是不断获取信息并回写;这里要注意的是,第一个真循环是保证获取新连接不会阻塞,第二个真循环是保证不停的获取客户端信息并回写;关于客户端则通过端口和IP,启动线程,通过一个循环不停的向服务端写数据;Netty入门基于上面的图,我们也可以学习Netty相关的基础入门。NioEventLoop(事件循环)1、新连接接入2、连接上的数据读取Channel(抽象连接)Socket、SocektChannel(IO\NIO)抽象ChannelHandler(业务逻辑处理)读写数据期间的业务层PipeLine(动态链处理)多个ChannelHa

  • 使用区块链技术的身份管理应用,MongoDB Stitch & MongoDB Atlas

    当今世界,我们的物理身份和数字身份有无数种方式交织在一起。如何从合作伙伴以及第三方厂商那里分享和采集信息,并在简化业务流程的同时保持信息的安全性和真实性是一个挑战。2017是区块链技术的大年。在众多的应用场景中,区块链技术开启了利用自身可信性、分布性和不可变性在不同实体间发布身份信息,并保持清晰的加密总账。敏感信息会经过严格的审批流程并被加密,只有通过特定方式才能访问。不过,区块链的核心概念并不在本篇博客的讨论范围之内。如希望了解区块链的更多内容,请浏览MongoDB博客。应用实例作为一种概念验证,我们搭建了一个区块链身份管理应用。我们使用区块链的结构和概念为一个虚拟的银行网络保存和发布数字身份。我们利用NodeJS搭建了一个节点网络,网络中的不同合作伙伴均参与网络运行,在区块链内部推送和管理区块的生产。图1-银行端应用展示了通过区块链进行登录验证的方式(对用户透明)图2-将身份信息发布到区块链图3-区块链网络上的节点批准信息签名和加密签名。信息被批准后,其他被认可方才可使用该信息主要理念是:数据可以被银行A推送到区块链网络(如图2所示),数据被网络的多数实体批准和使用,并作为可信信息

  • BI Intelligence 报告:2016 年 5 大数字化趋势

    【新智元导读】BusinessInsider网站日前公开了旗下调研团队BIIntelligence去年2月发布的调查报告,成功预测了消息APP成为新的OS和Bot的崛起。报告还预计物联网是下一场工业革命,将颠覆能源、制造、保险、医疗等8大产业,到2020年智能传感器将产生近8万亿美元投资回报。现在是数字化时代 现在,全球近43%人口连接到互联网。过去10年的技术发展比此前1万年都多。接下来5年,我们将见证更多的技术突破。BusinessInsider调研团队BIIntelligence在这份报告里,指出移动端、电商、数字媒体、数字金融服务和物联网这5大垂直领域各自的关键趋势。关注新智元(AI_era)在公众号回复“0613”下载报告PPT(请不要直接在文章下评论或留言)移动端:消息APP成为新的OS全球领先4大消息App每月拥有将近30亿活跃用户,打开率是普通App的5倍。鉴于用户在这些App停留时间过多,企业便设法让自己通过这些App连接到消费者。Facebook在消息APP大战中称霸 Facebook拥有FacebookMessenger和WhatsApp这两款全球第一和第二的消息

  • 机器学习集成算法——袋装法和随机森林

    随机森林是最流行、最强大的机器学习算法之一。它是机器学习集成算法中的一种,可称之为自助集成(BootstrapAggregation)或袋装法(Bagging)。在这篇文章中,您将学习使用袋装集成算法和随机森林算法建立预测模型。阅读这篇文章后,您将学到:用自助法从样本中估计统计量。用自助集成算法从单个训练数据集中训练多个不同的模型。强大的分类器——随机森林算法。它只对袋装法进行小小的调整。这篇文章是为开发人员编写的,不需要统计学或数学背景。这篇文章重点介绍了该算法的工作原理以及如何将其用于预测建模问题。如果您有任何问题,请留下评论,我会尽我所能来回答。让我们开始吧。机器学习集成算法中的袋装法和随机森林。照片由NicholasA.Tonelli提供,一些权利保留。自助法在我们学习袋装法之前,让我们快速了解一下自助法这个重要的基础技术。自助法是一种用于从数据样本中估计某个量的强大的统计方法。我们假设这个量是描述性的统计数据,如平均值或标准差。这样有助于我们理解它。假设我们有一个100个样本值(x),我们希望估计样本均值。我们可以直接从样本中计算均值,如下所示:mean(x)=1/100*s

  • 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)

    传统解法 题目来自leetcode335.SelfCrossing。 题意非常简单,有一个点,一开始位于(0,0)位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(selfcrossing)。 一个很容易想到的方案就是求出所有线段,然后用O(n^2)的时间复杂度两两判断线段是否相交,而线段相交的判断,可以列个二元一次方程求解(交点)。这个解法非常容易想到,但是实际操作起来比较复杂,接下去介绍利用向量的解法。 向量解法 简单回顾下向量,具体的自行谷歌。向量就是一条有向线段,这里要用到的是向量的叉乘。(还有个类似的概念叫做点积) 叉乘公式: 而因为p1Xp2=|a|*|b|*sinα,后者又是平行四边形的面积公式,所以可以用叉乘来求解平行四边形的面积(同理可以求解三角形的面积)。PS:如果给出三个点坐标,求解三角形面积的话,最好用叉乘来做,这样更精确,而不是海伦公式。 向量叉乘还能判断p0p1和p0p2两个向量,对于p0点而言,p0p1是位于p0p2顺时针方向,还是逆时针方向。 我们回到判断线段相交,两线段相交有如下两种可能。 对于第一种情况,我们可以判断p1,

  • Java Servlet(十二):Servlet、Listener、Filter之间的执行流程分析

    时隔几年后,看到本系列文章讲解的内容缺少了不少内容:周末无事分析了SpringSecurity是如何被集成到WebServlet(SpringMVC)时,需要重新理清Filter、Listener、Servlet(SpringMVC#DispatcherServlet)之间的执行顺序,于是就有了本篇文章。这个话题是WebServlet学习中的一个重点,弄清它们之间的执行流程,有助于理解SpringMVC、SpringSecurity这些框架是否如何与WebServlet集成到一起。 测试 新建一个webservletpom.xml项目web-servlet-01 pom.xml引入依赖: <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>compile</scope> </depen

  • 如何进行数组去重

    题目:编写一个数组去重函数。(使用尽量多的方法来实现) //如输入数组[1,"a",{b:2},{c:3},{b:2},{b:"2"},"1","a"],返回[1,"a",{b:2},{c:3},"1"]   functionunique(arr){ vartemp=[];//存储新数组 varkeys=[];//存储对象键集合 for(vari=0;i<arr.length;i++){ vara=arr[i]; if(typeofa!=="object"){ varidx=temp.indexOf(a) if(idx>-1){ continue; }else{ temp.push(a); } }else{ for(varkina){ varidx1=keys.indexOf(k); if(idx1===-1){//如果在keys中还不存在对象 keys.push(k);//存储键 temp.push(a);//值存储新数组 } } } } returntemp; }复制  

  • 交互式多媒体图书平台的设计与实现

    一、需求分析 1.功能性需求 交互式多媒体图书平台包括读者端和作者端,这两个客户端的需求是不同的,分别如下: 作者端:   可以编排图书的目录结构、章节内容 章节内容中包括图片、视频、文字 集成第三方软件边学边练,能定义常见练习题比如问答题、选择题 设定阅读顺序 编辑时可以预览读者端的效果 读者端包括手机、Web和桌面软件 可以限制只在某一种或几种终端上使用  读者端: 可以通过手机、浏览器或桌面软件使用交互式多媒体图书 可以搜索图书 可以查看图书目录 根据作者设定可以顺序解锁阅读,或随意跳跃阅读,或部分章节内部必须顺序阅读 集成或调用第三方软件,阅读过程中能直接调出第三方软件进行实际操作,并对操作做基本正误判断,然后回到图书继续阅读。 2.质量需求 高并发,可以支持许多读者和作者同时访问该平台 响应时间小,用户的操作需要及时进行响应 交互简单,易于用户使用 3.设计约束与过程约束 给第三方软件或者插件提供统一的接口 调用第三方软件由系统自动完成,不需要用户操作 读者端的手机App、Web或桌面软件使用统一的代码实现,优先考虑前后端为js+

  • 解决Win7旗舰版开机后无线网络识别非常慢的问题

    最近电脑开机后WIFI识别和连接非常慢,不知何故。查看百度安全卫士的优化记录,发现其禁用了 NetworkListService,将该服务设为自动启动,重启服务后,问题解决。PS:如此优化太可恶!

  • background-size定义背景图片的高和宽

    在CSS2.1中,背景图像应用到一个容器会保留他们的固定的尺寸。现在,CSS3增加了一个background-size属性允许拉伸(伸缩)或挤压背景图片。background-size:100%90px;这个属性挺好用的。让背景图片的高和宽与其所在容器的高和宽保持一致或对应的百分比。复制 <divclass="bg-size">背景图片大小被拉伸(宽度100%,高度80px)</div>复制 .bg-size{ width:200px; height:300px; background:url(http://image.zhangxinxu.com/image/study/s/s128/mm1.jpg)no-repeat; background-size:100%90px; }这样一来,背景图片的高度就可以保持为90px,而宽度则和div的宽度呈100%的关系。可代替之前的做法:<div><imgsrc="path/to"style="width:xxpx;height:xxpx"></div>而这种做法太不优雅。顺带介绍下它

  • 消息中间件系列教材 (十)- RabbitMQ - fanout 模式代码

      步骤1:先运行,看到效果,再学习步骤2:模仿和排错步骤3:pom.xml步骤4:RabbitMQUtil步骤5:TestProducer步骤6:TestDriectCustomer 步骤 1 : 先运行,看到效果,再学习 老规矩,先下载下载区(点击进入)的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。  先运行两次TestCustomer,启动两个消费者。 然后运行一次TestProducer,启动生产者,生产100条信息。  此时就可以看到如图所示两个消费者都能收到 这100条信息。 步骤 2 : 模仿和排错 在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。  模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 (可运行项目)和自己的代码,来定位问题所在。  采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。&nbs

  • FPGA开发基础————异步FIFO深度的计算与分析(1)

        这个文章早就想总结一下了,因为在自己刚开始学FIFO在处理异步多bit数据的时候,总对这个FIFO的深度选取跟耿于怀。看视频感觉也是讲的模棱两可。下面就主要总结一下,几种情况   第一种情况: fA>fB读写之间没有空闲周期(fA>fB在两个连续读写之间有一个周期的延迟): 写速率fA=80MHz 读速率fB=50MHz 突发长度BurstLength=120 读写之间没有空闲周期,是连续读写一个突发长度. 解决的方法:   写一个数据需要的时间=1/80MHz=12.5ns,写一个突发需要的时间=120*12.5ns=1500ns,读一个数据需要的时间=1/50MHz=20ns,每1500ns,120个数据被写入FIFO,但读一个数据需要20ns的时间,可以计算出,1500ns内读出多少个数据,1500/20=75,剩下的没有读出,就存在FIFO中,则需要120-75 =45,所以这种情况下,需要的FIFO最小深度为45 第二种情况: fA>fB读写都有空闲周期(fA>fB并给出了读写使能的百分比) 写速率fA=80MHz 读速率f

  • 11-shell test命令

    Shell中的test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。数值测试-eq   等于则为真-ne   不等于则为真-gt   大于则为真-ge   大于等于则为真-lt   小于则为真-le   小于等于则为真实例演示:  num1=100  num2=100  iftest$[num1]-eq$[num2]  then     echo'两个数相等!'  else     echo'两个数不相等!'  fi输出结果:  两个数相等!代码中的[]执行基本的算数运算,如:  #!/bin/bash  a=5  b=6  result=$[a+b]#注意等号两边不能有空格  echo"result为:$result"结果为:result为:11字符串测试=     &nb

  • 面向接口编程原理与实践

    面向接口编程原理 “基于接口而非实现编程”这条原则的英文描述是:“Programtoaninterface,notanimplementation”。我们理解这条原则的时候,千万不要一开始就与具体的编程语言挂钩,局限在编程语言的“接口”语法中(比如Java中的interface接口语法)。这条原则最早出现于1994年GoF的《设计模式》这本书,它先于很多编程语言而诞生(比如Java语言),是一条比较抽象、泛化的设计思想。 这条原则能非常有效地提高代码质量,之所以这么说,那是因为,应用这条原则,可以:: 将接口和实现相分离 封装不稳定的实现 暴露稳定的接口 上游系统面向接口而非实现编程,不依赖不稳定的实现细节,这样当实现发生变化的时候,上游系统的代码基本上不需要做改动,以此来降低耦合性,提高扩展性。 实际上,“基于接口而非实现编程”这条原则的另一个表述方式,是“基于抽象而非实现编程”。后者的表述方式其实更能体现这条原则的设计初衷。在软件开发中,最大的挑战之一就是需求的不断变化,这也是考验代码设计好坏的一个标准。越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性,越能应对未

  • 最简单的离散概率分布,伯努利分布 《考研概率论学习之我见》 -by zobol

    上文讲了离散型随机变量的分布,我们从最简单的离散型分布伯努利分布讲起,伯努利分布很简单,但是在现实生活中使用的很频繁。很多从事体力工作的人,在生活中也是经常自觉地“发现”伯努利分布,它很容易理解。   1.为什么要先从伯努利分布来学? 2.在生活中什么样的事情可能服从伯努利分布? 3.伯努利实验的三条性质 4.生活中的伯努利实验 5.伯努利分布的函数及其图像 6.伯努利分布的数学期望 7伯努利分布的方差   1.为什么要先从伯努利分布来学? 离散型随机变量对应的概率函数都是离散函数,其中很多离散函数是很复杂的。有一些可以看做是连续函数的离散型,有一些则根本找不到任何规律。而伯努利分布的函数图像是最简单的,就两个点,我们从最简单的开始学。   2.在生活中什么样的事情可能服从伯努利分布? 如果一个事情可以被简单分为两个结果,且概率和为1那么就可以服从伯努利分布。(可以说,真的很方便了,任何事情只要可以被简单看做1和0,就服从伯努利分布)   3.伯努利实验的三条性质 所谓伯努利实验就是指服从伯努利分布的实验,它具有三条性质:(1)可重复(2)两

  • 友好城市

      传送门:https://www.luogu.org/problemnew/show/P2782 想像两条纵向的数轴,从上到下的数依次是从小到大的,然后左右数轴连着一些线段,两条线段不相交当且仅当一条线段的左右端点均小于(或大于)另一条线段的左右端点。因此问题转化成对线段的左端点从小到大排序后,对右端点求最长上升子序列。但是若按常规的方法求最长上升子序列会超时,因此我们用upper_bound,省去了不必要的枚举。 #include<cstdio> #include<algorithm> usingnamespacestd; constintN=2e5+1; inlineintread() { staticcharch; while((ch=getchar())<'0'||ch>'9'); intret=ch-48; while((ch=getchar())>='0'&&ch<='9') ret=ret*10+ch-48; returnret; } intn,f[N],ans,p; structnode {

相关推荐

推荐阅读