superT

【Java 8】巧用Optional之优雅规避NPE问题

元气小坏坏 提交于 2020-10-28 08:41:57
避之不及的 NullPointerException NPE : NullPointerException 空指针异常是最常见的Java异常之一,抛出NPE错误不是用户操作的错误,而是开发人员的错误,应该被避免,那么只能在每个方法中加入非空检查,阅读性和维护性都比较差。 以下是一个常见的嵌套对象:一个用户所拥有的汽车,以及为这个汽车配备的保险。 public class User { private String userName; private Car car; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } } public class Car { private String carName; private Insurance insurance; public String getCarName() { return carName; } public void setCarName(String carName)

java8 Stream的实现原理 (从零开始实现一个stream流)

喜欢而已 提交于 2020-10-24 11:03:51
1.Stream 流的介绍 1.1 java8 stream介绍   java8新增了stream流的特性,能够让用户以函数式的方式、更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算。 1.2 从零开始实现一个stream流   相信很多人在使用过java8的streamAPI接口之后,都会对其实现原理感到好奇,但往往在看到jdk的stream源码后却被其复杂的抽象、封装给弄糊涂了,而无法很好的理解其背后的原理。究其原因,是因为jdk的stream源码是高度工程化的代码,工程化的代码为了效率和满足各式各样的需求,会将代码实现的极其复杂,不易理解。   在这里,我们将抛开jdk的实现思路, 从零开始实现一个stream流 。   我们的 stream流 同样拥有 惰性求值 , 函数式编程接口 等特性,并 兼容jdk的Collection等数据结构 (但不支持并行计算 orz)。   相信在亲手实现一个stream流的框架之后,大家能更好的理解流计算的原理。 2.stream的优点   在探讨探究stream的实现原理和动手实现之前,我们先要体会stream流计算的独特之处。   举个例子: 有一个List<Person>列表,我们需要获得年龄为70岁的前10个Person的姓名。 过程式的解决方案:    稍加思考,我们很快就写出了一个过程式的解决方案( 伪代码 ):

#JAVA泛型

南笙酒味 提交于 2020-10-17 23:38:51
泛型简介 泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。 一些常用的泛型类型变量: E:元素(Element),多用于java集合框架 K:关键字(Key) N:数字(Number) T:类型(Type) V:值(Value) 泛型方法 1. <T> 定义一个泛型方法: private static <T> T genericAdd(T a, T b) {} //泛型方法 public class GenericMethod1 { private static int add(int a, int b) { System.out.println(a + "+" + b + "=" + (a + b)); return a + b; } private static <T> T genericAdd(T a, T b) { System.out.println(a + "+" + b + "="+a+b); return a; } public static void main(String[] args) { GenericMethod1.add(1, 2); GenericMethod1.<String>genericAdd("a", "b"); }

java基础面试题1

二次信任 提交于 2020-08-20 09:31:30
&和&&的区别? & 无论左边表达式执行结果如何,都会执行右边 && 左边执行不符合条件时,右边不执行 1 public static void main(String[] args) { 2 int i = 1 ; 3 int j = 2 ; 4 5 // & 6 if (++i==10 & ++j==10) { // false 7 System.out.println(i); 8 System.out.println(j); 9 } 10 System.out.println(i); // 2 11 System.out.println(j); // 3 12 13 // & 14 if (++i==10 && ++j==10) { // false 15 System.out.println(i); 16 System.out.println(j); 17 } 18 System.out.println(i); // 3 19 System.out.println(j); // 3 20 } int 和 Integer 有什么区别?(基本数据类型有哪些?)(String不是基本数据类型) Java 为每个基本类型都提供了包装类,int 的包装类就是 Integer,并且从 jdk1.5 引入了自动拆箱、装箱机制,使得二者可以相互转换。 原始类型:boolean,char

JDK12的新特性:teeing collectors

偶尔善良 提交于 2020-08-18 12:49:37
简介 JDK12为java.util.stream.Collectors添加了一个新的teeing方法,怎么翻译呢?看到很多人都把它翻译成“发球台”,我不禁潸然泪下,哪里有那么复杂,tee就是T。它的作用就像是一个T型,数据从两头进入,然后从一头流出。teeing的作用也就在此。 更多内容请访问 www.flydean.com talk is cheap, show me the code 我最喜欢的就是一言不合上代码,文字的描述总是让人有点摸不着头脑,程序员还是要用程序说话。有了程序就有了逻辑,有了逻辑一切都有了。 各大网站上的例子都喜欢举maxBy和minBy的例子,我这里偏不,下面举一个统计学生平均分数和总分数的例子,希望大家能够喜欢: [@Test](https://my.oschina.net/azibug) public void useTeeing(){ List<Student> studentList= Arrays.asList( new Student("alice", 90), new Student("boy", 20), new Student("bruce", 40), new Student("batman", 100) ); String teeingResult=studentList.stream().collect( Collectors

Optional 容器类

会有一股神秘感。 提交于 2020-08-18 07:05:59
什么是Optional容器类 Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以 避免空指针异常 。 Optional类常用方法: Optional.of(T t) : 创建一个 Optional 实例。 Optional.empty() : 创建一个空的 Optional 实例。 Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例。 isPresent() : 判断是否包含值。 orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。 orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。 orElseThrow(Supplier es) : 当遇到一个不存在的值的时候,并不返回一个默认值,而是抛出异常。 map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()。 flatMap(Function mapper):与 map 类似,要求返回值必须是Optional。 filter(Predicate p):接收一个函数式接口,当符合接口时

Java CompletableFuture

依然范特西╮ 提交于 2020-08-18 06:36:45
CompletableFuture 是 Java 8 提供的强大的函数式异步编程辅助类。 1 Future Future 是Java 5添加的类,用来描述一个异步计算的结果。你可以使用 isDone 方法检查计算是否完成,或者使用 get 阻塞住调用线程,直到计算完成返回结果,你也可以使用 cancel 方法停止任务的执行。 public class BasicFuture { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService es = Executors.newFixedThreadPool(10); Future<Integer> f = es.submit(() ->{ // 长时间的异步计算 // …… // 然后返回结果 return 100; }); // while(!f.isDone()) // ; f.get(); } } 虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的CPU资源,而且也不能及时地得到计算结果

Java 集合排序策略接口 Comparator

≡放荡痞女 提交于 2020-08-09 02:25:13
1. 前言 最近用到了集合排序(基于 Java 8)。现在我能用 Stream 的就用 Stream ,真香!排序可以这么写: List<People> peoples = new ArrayList<>(); // 中间省略 // 按照年龄从小到大排序 peoples.sort(Comparator.comparing(People::getAge)); 这里排序用到了一个关键接口 java.util.Comparator 。排序比较作为业务中经常出现的需求,我们有必要研究一下这个接口。 2. Comparator 概念 Comparator 是一个函数式接口。它经常用于没有天然排序的集合进行排序,如 Collections.sort 或 Arrays.sort 。或者对于某些有序数据结构的排序规则进行声明,如 TreeSet 、 TreeMap 。也就是该接口主要用来进行集合排序。 3. Comparator 中的方法 Comparator 作为一个函数式接口只有一个抽象方法,但是它有很多的默认方法,我们来认识一下这些方法们。 3.1 compare 抽象方法 作为 Comparator 唯一的抽象方法, int compare(T o1,T o2) 比较两个参数的大小, 返回负整数,零,正整数 ,分别代表 o1<o2 、 o1=o2 、 o1>o2 ,通常分别返回 -1 、

2020阿里最新出品的泰山版Java开发手册,告别垃圾代码

核能气质少年 提交于 2020-08-07 07:33:12
说起华山,我就想起岳不群,不,令狐冲;说起泰山,我就想起司马迁,他的那句名言“人总有一死,或重于泰山,或轻于鸿毛”,真的发人深省啊。这就意味着,阿里出品的泰山版 Java 开发手册,是迄今为止最重量级的。 华山版是上个版本,啥时候更新的呢?2019 年 06 月 13 号,距离现在 10 个月了,时间也不短了,是时候更新了。 新版都更新了哪些内容呢?可以从官方的版本历史中看得出来。 01、发布错误码统一解决方案 错误码用来干嘛呢?答案是异常日志,方便我们快速知晓错误来源,判断是谁那出的问题。上图中 A 表示错误来源于用户;还有 B 级的,表示错误来源于当前系统;C 级的,表示错误来源于第三方服务,比如 CDN 服务器。 这个解决方案还是值得借鉴的,很多成熟的系统都在使用错误码,如果你对接过微信支付的话,应该对错误码不会感到陌生。看到错误码,然后在手册中搜索一下,就能快速知晓错误的类型,还是很不错的。 02.新增 34 条新的规约 34 条太多了,我就挑几个重要的拉出来说一说吧。 1)日期时间 还记得上次技术圈的刷屏事件吧?就是那个 YYYY 和 yyyy 造成的问题。大写的 Y 表示的是当天所在的这一周是属于哪个年份的,小写的 y 表示的是当天所在的年份,差别还是挺大的。你品,你细品。 还有,大写的 M 和 小写的 m 是不同的,大写的 H 和小写的 h 也是不同的。 另外

关于Java8的精心总结

前提是你 提交于 2020-08-06 03:53:23
前言 ​ 最近公司里比较新的项目里面,看到了很多关于java8新特性的用法,由于之前自己对java8的新特性不是很了解也没有去做深入研究,所以最近就系统的去学习了一下,然后总结了一篇文章第一时间和大家分享一下。 ​ ​ 在了解一项新技术之前,我们需要了解我们为什么要去学习它以及它的优点,以下是我总结的: Java8(又称jdk1.8)是java语言开发的一个主要版本,Java8是oracal公司于2014年3月发布,可以看成是自java5以来最具有革命性的版本。 新特性的优点: 速度更快、代码更少、便于并行、最大化减少空指针异常 函数式编程提供了一种更高层次的抽象化 排序: List<RoleEntity> rolesListSort = rolesList.stream().sorted(Comparator.comparing(RoleEntity::getCreateDate)).collect(Collectors.toList()); Consumer是一个函数式接口 参数是Consumer类型的,Consumer里面的泛型表示泛型的类型要么是Integer,要么是Integer的父类,super表示它及它上面的,也就是父类。 下面这段代码是在Iterable接口里面的默认方法,jdk8之后的新方法,默认方法(默认方法的引入很大程度上是为了保证向后兼容) default