optional

Java8新特性——Optional类的使用(有效的避免空指针异常)

烂漫一生 提交于 2020-05-01 01:20:55
##OPtional类的使用 ###概述 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。 Optional实际上是个容器:<font color =rerd size=3>它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。</font> Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 <font color =red>Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。</font> ###Optional类的常用方法: <font color=red size=5>Optional.empty() : 创建一个空的 Optional 实例 Optional.of(T t)

docker 中运行的 jenkins 使用 npm 构建 Node.js 应用

人盡茶涼 提交于 2020-04-30 17:31:01
一、jenkins 的安装 配置要求 最小 256MB 内存,推荐 512MB 以上 10GB硬盘空间,用于安装 Jenkins、Docker 镜像和容器 在 Docker 中运行 Jenkins 我们在服务器上面为 jenkins 准备数据目录,假设为 /home/data/www/jenkins.wzlinux.com ,前提是我们已经在服务器上面安装好了 docker。 docker run \ --name jenkins \ -u root \ -d \ -p 8080:8080 \ -p 50000:50000 \ -e TZ="Asia/Shanghai" \ -v /home/data/www/jenkins.wzlinux.com:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ --restart=on-failure:10 \ jenkinsci/blueocean 配置 jenkins 使用浏览器打开服务器的 8080 端口,并等待 Unlock Jenkins 页面出现。 可以使用如下命令获取管理员的密码: docker logs jenkins 关于插件的安装我这里也不介绍了,有什么不懂的可以微信联系我。 二、配置 pipeline 2.1、配置源 我们从 github

9个小技巧让你的 if else看起来更优雅

夙愿已清 提交于 2020-04-30 16:57:54
if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼,例如下面这个伪代码: 是不是很奔溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我们无数次 review 别人代码时,都会发现类似的场景,那么我们本文就来详细聊聊,有没有什么方法可以让我们避免来写这么多的 if else 呢? 我们本文提供了 9 种方法来解决掉那些“烦人”的 if else,一起来看吧。 1.使用 return 我们使用 return 去掉多余的 else,实现代码如下。 优化前代码: if ("java".equals(str)) { // 业务代码...... } else { return; } 优化后代码: if (!"java".equals(str)) { return; } // 业务代码...... 这样看起来就会舒服很多,虽然相差只有一行代码,但真正的高手和普通人之间的差距就是从这一行行代码中体现出来的。 「勿以善小而不为,勿以恶小而为之」「千里之堤,溃于蚁穴」 ,说的都是同样的道理。 2.使用 Map 使用 Map 数组,把相关的判断信息,定义为元素信息可以直接避免 if else 判断,实现代码如下。 优化前代码: if (t == 1) { type = "name"; } else if (t == 2) { type =

Java8 中的 Optional

风格不统一 提交于 2020-04-29 15:35:27
从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。 本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。 Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。 我们从一个简单的用例开始。在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException : String isocode = user.getAddress().getCountry().getIsocode().toUpperCase(); 在这个小示例中,如果我们需要确保不触发异常,就得在访问每一个值之前对其进行明确地检查: if (user != null) { Address address = user.getAddress(); if (address != null) { Country country = address.getCountry(); if (country != null) { String isocode = country.getIsocode(); if (isocode

Java 8 Optional的正确姿势(转)

旧时模样 提交于 2020-04-29 15:35:09
Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。 当我们还在以如下几种方式使用 Optional 时, 就得开始检视自己了 调用 isPresent() 方法时 调用 get() 方法时 Optional 类型作为类/实例属性时 Optional 类型作为方法参数时 isPresent() 与 obj != null 无任何区别, 我们的生活依然在步步惊心. 而没有 isPresent() 作铺垫的 get() 调用在 IntelliJ IDEA 中会收到告警。调用 Optional.get() 前不事先用 isPresent() 检查值是否可用. 假如 Optional 不包含一个值, get() 将会抛出一个异常! 把 Optional 类型用作属性或是方法参数在 IntelliJ IDEA 中更是强力不推荐的! 使用任何像 Optional 的类型作为字段或方法参数都是不可取的. Optional 只设计为类库方法的, 可明确表示可能无值情况下的返回类型. Optional 类型不可被序列化, 用作字段类型会出问题的!!! 正确的应该是: 尽量避免使用的地方: 1、避免使用Optional.isPresent()来检查实例是否存在,因为这种方式和null != obj没有区别

如何优雅处理多参数返回/无参数返回——std::optional

烈酒焚心 提交于 2020-04-29 15:02:23
什么是std::optional? C++17中新引入了 std::optional<T> 。类模板 std::optional 管理一个 可选 的容纳值。简单说来, std::optional 就是一个和类型,常见的用处就是作为函数返回值来处理一个可能失败的函数。 如何处理无参返回? 此前处理无参返回的函数一般有两种方式。 第一种: bool foo(int param1, int*param2); 返回参数作为引用/指针型输入参数而存在,传入地址,在执行完毕后访问指定地址得到返回值,而使用真正的返回值来作为函数是否成功的返回。 这种方式可以实现需求。 缺点是: 浪费存储空间——无论是否返回值,都需要做好有值的准备, param2 的空间需要事先分配 可读性/可用性差——同为参数,有的是输入参,有的是输出参,即使以名字取分,使用的时候也比较困难。 第二种: std::pair<T,bool>foo(int param1); 这是比较常用的方式,解决了问题2——每次使用都知道返回值是 pair 的第一个值,第二个值专门用于成功与否的判断。 不过 std::optional 继续优化了处理方式。 正如前述, std::optional 管理的是 可选的 容纳值。如果函数成功执行,则实例含值,如果执行失败,实例不含值。 如何处理多参返回? 这都不是个问题, class , struct

Java 8系列之Stream的基本语法详解

给你一囗甜甜゛ 提交于 2020-04-29 10:22:33
本文转至:https://blog.csdn.net/io_field/article/details/54971761 Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的reduce 概述 继 Java 8系列之Lambda表达式 之后,我们来了解Stream。Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等。 聚合操作 为了学习聚合的使用,在这里,先定义一个数据类: public class Student { int no; String name; String sex; float height; public Student(int no, String name, String sex, float height) { this.no = no; this.name = name; this.sex = sex; this.height = height; } **** } Student stuA = new Student(1, "A", "M", 184);

java8新特性学习:stream与lambda

社会主义新天地 提交于 2020-04-29 10:21:16
Streams api 对 Stream 的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect)。 流的操作类型分为两种: Intermediate:一个流可以后面跟随零个或多个 intermediate 操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。 Terminal:==一个流只能有一个 terminal 操作==,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。 short-circuiting。用以指: 对于一个 intermediate 操作,如果它接受的是一个无限大(infinite/unbounded)的 Stream,但返回一个有限的新 Stream。 对于一个 terminal 操作,如果它接受的是一个无限大的 Stream,但能在有限的时间计算出结果。 当操作一个无限大的 Stream,而又希望在有限时间内完成操作,则在管道内拥有一个 short-circuiting 操作是必要非充分条件。 map/flatMap map

Java基础-集合框架-ArrayList源码分析

[亡魂溺海] 提交于 2020-04-28 08:15:09
一、JDK中ArrayList是如何实现的 1、先看下ArrayList从上而下的层次图: 说明:   从图中可以看出,ArrayList只是最下层的实现类,集合的规则和扩展都是AbstractList、List、Collection等上层的接口所设定的,而ArrayList实现或继承了上层的规则,然后重新或扩展来处理集合中的数据。 2、看看接口:Iterable<E>中都定义了那些规则? JDK1.8中的源码: 1 package java.lang; 2 3 import java.util.Iterator; 4 import java.util.Objects; 5 import java.util.Spliterator; 6 import java.util.Spliterators; 7 import java.util.function.Consumer; 8 public interface Iterable<T> { // 实现这个接口允许对象成为 "foreach" 语句的目标。 9 Iterator<T> iterator(); 10 default void forEach(Consumer<? super T> action) { 11 Objects.requireNonNull(action); 12 for (T t : this ) { 13

优雅处理null,向空指针说再见!

梦想与她 提交于 2020-04-28 08:00:46
导语 作为一位Java研发,饱受了NullPointerException摧残。一方面如果不做null的判断,程序可能出现NullPointerException,另有一方如果做null判断,这些判断让开发起来感到奔溃,也让后来阅读人摸不着头脑。对应Java中的空指针,小编只想说一句,无论你处不处理,它都在那里,不离不弃,只为摧残你! 业务中的空值 一般我们开发过程经常用接收的两种返回值,集合和实体对象,例如我们通常使用的定义的接口 public interface UserSearchService{ List<User> listUser(); User get(Integer id); } listUser()经常遇到的实现方案 public List<User> listUser(){ List<User> userList = userDao.selectAll(); if(CollectionUtils.isEmpty(userList)){ return null; } return userList; } 这段代码返回情况两种null和集合,集合就是正常返回内容,特殊的是null值。如果调用不对返回值进行判断,那么恭喜调用者等待接收NullPointerException吧。从开发角度来说,如果接口返回null,会给调用者带来潜在风险,尤其是对方经验尚浅的情况