来源:Lrwin lrwinx.github.io/2016/04/28/如何优雅的设计java异常/ 导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈一谈我是如何对异常进行处理的...,如果这样使用的话,是在将异常的作用扩大化,这样将会导致代码复杂程度的增加,耦合性会提高,代码可读性降低等问题。...那么就一定不要使用这样的异常吗?其实也不是,在真的有这样的需求的时候,我们可以这样使用,只是切记,不要把它真的当成控制流程的工具或手段。那么究竟什么时候才要抛出这样的异常呢?...= uid){ //进行处理.. } return null; } 上边的例子,如果只判断uid为空还好,如果再去判断address这个实体中的某些必要属性是否为空,在字段很多的情况下...第二种异常是指在service中抛出什么样的异常就自定义一个指定的异常错误,然后在进行抛出异常。 一般来讲,如果系统没有别的特殊需求的时候,在开发设计中,建议使用第二种方式。
,如果这样使用的话,是在将异常的作用扩大化,这样将会导致代码复杂程度的增加,耦合性会提高,代码可读性降低等问题。...那么就一定不要使用这样的异常吗?其实也不是,在真的有这样的需求的时候,我们可以这样使用,只是切记,不要把它真的当成控制流程的工具或手段。那么究竟什么时候才要抛出这样的异常呢?...我们把关注点放在restful的api层(和web中的controller层类似)和service层,研究一下在service中如何抛出异常,然后api层如何进行捕获并且转化异常。...= uid){ //进行处理.. } return null; } 上边的例子,如果只判断uid为空还好,如果再去判断address这个实体中的某些必要属性是否为空,在字段很多的情况下...第二种异常是指在service中抛出什么样的异常就自定义一个指定的异常错误,然后在进行抛出异常。 一般来讲,如果系统没有别的特殊需求的时候,在开发设计中,建议使用第二种方式。
前言 Stream是Java 8 API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式) Stream流是对集合(Collection...Stream API提供了mapToInt、mapToDouble、mapToLong三种方式将对象流【即Stream 】转换成对应的数值流,同时提供了boxed方法将数值流转换为对象流 文件创建 try...,具备将指定元素累加存放到结果容器中的能力;并在Collectors工具中提供了Collector接口的实现类 toList 将用户ID存放到List集合中 List idList =...)/orElseGet(null)表示如果找不到值则返回null。...orElse(value)/orElseGet(value) 可以设置默认值。如果找不到就会返回中设置的默认值。 不同点: 在使用方法时, orElse无论是否有值都会执行。
一、流(Stream)简介 流是 Java8 中 API 的新成员,它允许你以声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。...那么为什么到了 Java 的集合中,这样做就不行了呢? 另外一点,如果我们想要处理大量的数据又该怎么办?是否是考虑使用多线程进行并发处理呢?...如果是,那么可能编写的关于并发的代码比使用迭代器本身更加的复杂,而且调试起来也会变得麻烦。 基于以上的几点考虑,Java 设计者在 Java 8 版本中,引入了流的概念,来帮助您节约时间!...在上面的代码中,findFirst() 可能什么元素都找不到,Java 8 的设计人员引入了 Optional,这样就不用返回众所周知容易出问题的 null 了。...此类查询需要将流中的元素反复结合起来,得到一个值。这样的查询可以被归类为归约操作(将流归约成一个值)。
那么为什么到了 Java 的集合中,这样做就不行了呢? 另外一点,如果我们想要处理大量的数据又该怎么办?是否是考虑使用多线程进行并发处理呢?...如果是,那么可能编写的关于并发的代码比使用迭代器本身更加的复杂,而且调试起来也会变得麻烦。 基于以上的几点考虑,Java 设计者在 Java 8 版本中,引入了流的概念,来帮助您节约时间!...在上面的代码中,findFirst() 可能什么元素都找不到,Java 8 的设计人员引入了 Optional,这样就不用返回众所周知容易出问题的 null 了。...此类查询需要将流中的元素反复结合起来,得到一个值。这样的查询可以被归类为归约操作(将流归约成一个值)。...对于复杂操作,Stream串行API性能可以和手动实现的效果匹敌,在并行执行时Stream API效果远超手动实现。 所以,如果出于性能考虑,1. 对于简单操作推荐使用外部迭代手动实现,2.
---- BroadcastState BroadcastState介绍 在开发过程中,如果遇到需要下发/广播配置、规则等低吞吐事件流到下游所有 task 时,就可以使用 Broadcast State...Broadcast State 是 Flink 1.5 引入的新特性。 下游的 task 接收这些配置、规则并保存为 BroadcastState, 将这些配置应用到另一个数据流的计算中 。...需求-实现配置动态更新 实时过滤出配置中的用户,并在事件流中补全这批用户的基础信息。 事件流:表示用户在某个时刻浏览或点击了某个商品,格式如下。...descriptor); //再清空历史状态数据 broadcastState.clear(); //最后将最新的广播流数据放到...* 2.用户信息流(配置流/规则流): > 用户的详细信息 * 3.将较小的信息流(配置流/规则流)作为状态广播到各个节点,便于对实时日志事件流中的用户信息进行补全!
前言: 今天跟大家分享一下java8的新特性之一—流,肯定有很多人见到过,但是我相信目前很多人还没有广泛的使用流—可能暂时没有使用流的意识,或者说是使用的不熟练,如果真的是这样,那么今天分享的文章肯定会给你带来巨大的冲击...一、热身运动 流可以帮助我们写出更优雅且高性能的代码,比如有这样一个场景,比如你有一个女朋友(没有的话就new一个吧),然后你女朋友的包包中装了很多的东西,现在需要将你女朋友的包包中的东西都拿出来,如果我们使用传统的迭代器...那么如果我们使用java8的流操作将会是下面的场景: 你:媳妇儿,把你包包里面的东西都拿出来放到桌子上 就是这么简单,我们下面来详细的学习一下流的操作 上面的实例可能有些人会觉得集合也能用一些清空的操作啊...二、流的定义及描述 流:从支持数据处理操作的源生成的元素序列 看上去很青涩,很难理解,那就算了,我们尽量用一些比较容易理解的思维来转换对流的理解,比如我们可以将流的操作比作数据库的操作 如刚才上面获取低热量的菜名...,大家可以略过这一点,重点看java8的代码和java8之前进行对比,其实如果你看完了我相信对stream非常热爱,甚至可能会回去改代码了。
那希望我接下来的分享给大家带来一些帮助和启发 版本说明: Java:1.8 Flink:1.12.0 一、前言 Apache Flink 是一个流处理框架,它允许用户以高吞吐量和低延迟的方式处理实时数据流...在 Maven 中,group ID 用于唯一标识你的项目所属的组织或项目组。这里,它被设置为 org.myorg.quickstart。...// DataStream 是 Flink 中做流处理的核心 API // 使用换行符来分割从 socket 流中接收到的文本数据,每当它读取到一个换行符,就会将前面的文本作为一个单独的记录...输出如下图所示: 4、Flink 运行 jar 包启动 4.1 部署源码 在这里我将 flink-1.12.0 源码包放到了 Linux 虚机上,配置好 Java 环境,然后配置 Flink 环境变量。...4.2 运行 WordCount 程序 将打的 jar 包,放到 Linux 虚机上,然后运行命令: # 因为配置了flink的环境变量,所以在任意目录下都可以执行flink命令 flink run -
不是的,如果你仔细看逻辑,它们都是是在容器初始化的过程中一次性加载的,所以不会像 populateList 随着调用次数的增加,无限撑大 List 未关闭的流 在学习流的时候老师就在耳边反复说: 一定要关闭流...,最终都还没关闭,结果可想而知 解决办法 流的解决办法很简单,其实主要遵循相应范式就可以避免此类问题 通过 try/catch/finally范式在 finally 关掉流 如果你用的 Java 7+...id; public Person(String name, Integer id){ this.name = name; this.id = id; } } Person 类没有重写...hash 值是存在对象头中的,我们还知道对象头中还可能存储线程ID,所以他们在某些情形中还会存在冲突 对象头中 hashCode 和 偏向锁的冲突 jvm 启动时,可以使用 -XX:+UseBiasedLocking...() 方法,而是用 ThreadLocal.set(null) 会达到同样的效果吗?
在这里我会很详细的讲解每一步代码,主要是方便新人看懂,弥补曾经自己学习过程中的苦恼。提醒:如果第一种写法理解不了或则看不懂,可以看第二种写法,通过第二种写法去理解第一种的写法,两种写法逻辑是一样的。...(); PS:这里我是通过查询数据获取的数据,练习的话,可以new一些数据出来存入集合中就行了 第三步:判断获取的数据是否为空,如果为空的话就没有去整理成树结构的必要了,数据都没有...if (CollectionUtil.isNotEmpty(menuList)){ .... } PS:这里我用的是糊涂类提供的方法进行判断,如果小白在写的过程中发现报错,找不到这个方法或则这个类就换一种写法...collect(Collectors.toList()):将处理后的流中的元素收集到一个新的列表中,并返回该列表 因此,这段代码的作用是将原始列表menuList中的每个元素转换为AuthMenuResVO...pdrList : null);使用三目运算符,如果pdrList集合不为空就表示当前元素有子集,然把pdrList集合赋值给元素的authMenuList属性,如果为空就表示没有子集,赋值空就可以。
地图 API 获取到 省市区街道位置 需求 实时Flink DataStream 过滤出配置中(数据库)的用户,并在事件流中补全这批用户的基础信息。..., String, Integer>> result = clickSource.connect(broadcastDS) //-4.处理连接后的流-根据配置流补全事件流中的用户的信息...>>> broadcastState = ctx.getBroadcastState(broadcastDesc); //最后将最新的广播流数据放到 state...= null) rs.close(); } } } 实时的数据流和 动态变化的数据库中的配置流 进行 connect 操作, 打印输出 双流 JOIN Streaming File...等 抽取数据 需求 通过在 socket 数据流中将数据定时 2秒钟写入到 hdfs 上。
如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。...注意需要关闭的流,必须写在try(...)中。三、stream流stream流是jdk8的新特性,stream流更像一个高级版本的 Iterator,可以很方便地为我们提供各种操作。...如我们先定义一个BiFunction,连接将k和v放到数组中,逗号分隔:BiFunction func = (k,v) -> String.join("...上面这段代码,是获取id为1的name,如果不存在,返回"路人甲",注意,这里只是给个默认返回值,并不会保存到map里。...-> "路人甲");上面这段代码,是获取id为1的name,如果不存在,存入字符串"路人甲",并返回。
Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等...在Java8中Stream API作为数据渠道,用于操作数组或者集合等数据源。...,中间操作吧,什么叫中间操作呢,中间操作指的是我们用上面的方法使用数据源返回流之后,我们通过一些操作达到我们想要的效果(比如排序,去重等等) 02 — 中间操作 我们先看一些流操作的API: 一.筛选与切片...说到这里本应该继续往下说映射的,但是考虑到虽然讲解了知识点,还是想运用到实际的项目中,这样才能真正理解它,所以关于映射我决定放到下一节再讲(等不及的小伙伴可以现在网上看看哦,资料很多)。...那我们就可以以流的形式,去除缓存中存入的用户在一个页面的重复数据,并拿到停留时间最久的数据。 今天呢,就先说这么多,还不熟悉的小伙伴可以去练习一下,这对于熟悉Lambad表达式和方法引用也有好处。
在java8之前,甚至有些人在java8之后,都会想着借助一个中间变量保符合要求的菜品,然后排序。...上述写法有什么问题吗,可以发现lowCaloricDishes 只使用了一次,真就一个临时变量。那能不能跳过创建变量的过程,你直接把数据给我,我经过过滤排序后得到想要的呢,就和流水线一样。...= Stream.of("java"); } 流的操作 可以连接起来的流操作称为中间操作,关闭流的操作称为终端操作 通俗地讲,返回结果是流的操作称为中间操作,放回的不是流的操作称为终端操作。...流的使用 就按照官网上的java API顺序来讲述,小插一句,之前我一直没有学流是主要是因为感觉接口会很多,怎么可能记得了这么多,其实这几天看才发现真的很少,基本上不用记。 ?...Java8引入的目的主要是/为了不要返回容易出现问题的null了。
当然 不论新老朋友 我相信您都可以 从中获益。如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力!...模块系统小结 我们从上面的例子中可以看到,我们可以指定我们想要导出和引用的软件包,没有人可以不小心地使用那些不想被导出的软件包中的类。...(System.out::println) 2 4 16 ofNullable() 方法 在 Stream API 中,ofNullable() 返回包含单个元素的顺序 Stream(如果非null),...反应流示例 让我们从一个简单的示例开始,在该示例中,我们将实现 Flow API Subscriber 接口并使用 SubmissionPublisher 创建发布者并发送消息。...JavaDoc 关于 Boolean 的说明截取 多分辨率图像 API 在 Java SE 9 中,Oracle Corp 将引入一个新的 Multi-Resolution Image API。
JDK给我们提供了非常丰富的API,可以去操作IO流。...15.用equals方法比较是否相等 不知道你在项目中有没有见过,有些同事对Integer类型的两个参数使用==号比较是否相等? 反正我见过的,那么这种用法对吗?...少用@Transactional注解 将查询(select)方法放到事务外 事务中避免远程调用 事务中避免一次性处理太多数据 有些功能可以非事务执行 有些功能可以异步处理 关于大事务问题我的另一篇文章《...由于篇幅有限,在这里我就不过多介绍了,更详细的内容可以看看我的另一篇文章《消除if...else是9条锦囊妙计》 21.防止死循环 有些小伙伴看到这个标题,可能会感到有点意外,代码中不是应该避免死循环吗...如果想要打印某个分类的所有父分类,可以用类似这样的递归方法实现: public void printCategory(Category category) { if(category == null
第2步:创建数据源 创建数据源是指定义我们的Flink程序从哪里获取数据。 如果是实时计算,一般工作中我们都是从Kafka中获取数据。...如果是跑批处理,一般是从txt,csv,hdfs上读取数据。 还记得一开始说的Flink自我介绍数据流上的有状态计算这句话吗? 我认为很有必要先理解下什么是流? 4.1 什么是流?...有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理。...4.2 从指定的数据集合创建流(一般测试时用) 一般在测试自己代码时,可以这样用,以便快速验证自己写的转换算子是否对。...,每层在简洁性和表达性之间进行了不同的权衡,DataStream API为许多通用的流处理操作提供原语,比如window。
下方是判断user是否为空,不为空通过User#getSchool()获取学校名的操作 例如此处我写到这里 User user = new User(); // idea提示下方参数,如果没显示,光标放到括号里按...(user).map(User::getSchool).orElse("NO_SCHOOL"); // 如果想要为null时才调用方法为其提供默认值,可以使用orElseGet // 这在一些为null...8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。...// 声明式编程是告诉计算机需要计算“什么”而不是“如何”去计算 // 现在,我想要一个List,包含3个数字8 List list = // 我想要:..., 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
对于以上描述的接口方法来看,大概可以推断出可能它包含了以下两个含义:listUser(): 查询用户列表get(Integer id): 查询单个用户 在所有的开发中,XP推崇的TDD模式可以很好的引导我们对接口的定义...get(Integer id) 如果没有这个对象,是抛异常还是返回null呢?...当然对于实际操作来讲,返回如果Person为空,将返回null,但是PersonDTO是不能返回null的(尤其Rest接口返回的这种DTO)。...Optioanl是一种分支的判断,那我们究竟是关注 Optional还是Optional.get()呢? 我给大家的建议是,如果不想要这样的歧义,就不要使用它!...即便 我java bean中的getter是符合Optional的,但是因为java bean 太多了,这样会导致你的代码有50%以上进行Optinal的判断,这样便污染了代码。
领取专属 10元无门槛券
手把手带您无忧上云