一、判空

集合判空

  1. 可以使用Objects.isNullisEmpty 组合进行判空,也可以使用CollectionUtils.isEmpty进行判空,等价于上边组合。
  1. List<String> list = new ArrayList<>();
  2. Objects.isNull(list);
  3. list.isEmpty();
  4. //上边两行等价于该行 (推荐使用)
  5. CollectionUtils.isEmpty(list);

字符串判空

  1. pom 文件引入包
  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-lang3</artifactId>
  4. <version>3.4</version>
  5. </dependency>
  1. java 文件导入包
  1. import org.apache.commons.lang3.StringUtils;
  1. 代码演示
  1. String s = "";
  2. //判断是否为 null 和 size == 0 (带trim效果)推荐使用
  3. StringUtils.isBlank(s);
  4. //判断是否为 null 和 size == 0
  5. StringUtils.isEmpty(s);
  6. //多个判空,只要有一个为空,即返回FALSE
  7. StringUtils.isAnyBlank("124","234");

其他判空

  1. Integer or Long
  1. Integer integer = new Integer(2);
  2. Objects.isNull(integer);
  3. Long lo = null;
  4. Objects.isNull(lo);

二、判断相等

  1. String s1 = "";
  2. String s2 = "";
  3. //方法一
  4. s1.equals(s2);
  5. //方法二(推荐使用,避免空指针)
  6. Objects.equals(s1,s2);

三、Optional 实例

1.of

为非 null 的值创建一个 Optional。of 方法通过工厂方法创建 Optional 类。需要注意的是,创建对象时传入的参数不能为 null。如果传入参数为 null,则抛出 NullPointerException 。

  1. Optional<String> optional = Optional.of("xiaoming");
  2. //传入null,抛出NullPointerException
  3. Optional<Object> o = Optional.of(null);

2.ofNullable

为指定的值创建一个 Optional,如果指定的值为 null,则返回一个空的 Optional。

  1. Optional<Object> o1 = Optional.ofNullable(null);

3.isPresent

值存在返回 true,否则返回 false

  1. Optional<String> optiona2 = Optional.of("xiaoming");
  2. System.out.println(optiona2.isPresent());

4.get

Optional 有值就返回,没有抛出 NoSuchElementException

  1. Optional<Object> o1 = Optional.ofNullable(null);
  2. System.out.println(o1.get());

5.ifPresent

如果 Optional 有值则调用 consumer 处理,否则不处理

  1. Optional<Object> o1 = Optional.ofNullable(null);
  2. o1.ifPresent(s -> System.out.println(s));

6.orElse

如果有值则将其返回,否则返回指定的其它值

  1. Optional<Object> o1 = Optional.ofNullable(null);
  2. System.out.println(o1.orElse("输出orElse")); // 输出orElse

7.orElseGet

orElseGet 与 orElse 方法类似,区别在于得到的默认值。orElse 方法将传入的字符串作为默认值,orElseGet 方法可以接受 Supplier 接口的实现用来生成默认值

  1. Optional<Object> o1 = Optional.ofNullable(null);
  2. System.out.println(o1.orElseGet(() -> "default value")); // default value
  • 注意:orElse 和 orElseGet 看似差不多,其实有很大不同;看下面例子
  1. Shop shop = null;
  2. System.out.println("test orElse");
  3. Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
  4. Optional.ofNullable(shop).orElseGet(()->createNew());
  5. //createNew
  6. private static Shop createNew() { System.out.println("create new");
  7. return new Shop("尺子", 50);
  8. }//输出:
  9. test orElsecreate newtest orElseGetcreate new
  10. Shop shop = new Shop("钢笔",100);
  11. System.out.println("test orElse");
  12. Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
  13. Optional.ofNullable(shop).orElseGet(()->createNew());
  14. //输出
  15. test orElsecreate newtest orElseGet

从上面两个例子可以看到,当 Optional 为空时,orElse 和 orElseGet 区别不大,但当 Optional 有值时,orElse 仍然会去调用方法创建对象,而 orElseGet 不会再调用方法;在我们处理的业务数据量大的时候,这两者的性能就有很大的差异。

8.orElseThrow

如果有值则将其返回,否则抛出 supplier 接口创建的异常。

  1. Optional<Object> o1 = Optional.ofNullable(null);
  2. try {
  3. o1.orElseThrow(() -> new Exception("异常!"));
  4. } catch (Exception e) {
  5. System.out.println("info:" + e.getMessage());
  6. }//输出:info:异常!

9.map

如果有值,则对其执行调用 mapping 函数得到返回值。如果返回值不为 null,则创建包含 mapping 返回值的 Optional 作为 map 方法返回值,否则返回空 Optional。

  1. Optional<String> optional = Optional.of("xiaoming");
  2. String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
  3. System.out.println(s); //输出: XIAOMING

10.flatMap

如果有值,为其执行 mapping 函数返回 Optional 类型返回值,否则返回空 Optional。与 map 不同的是,flatMap 的返回值必须是 Optional,而 map 的返回值可以是任意的类型 T

  1. Optional<String> optional = Optional.of("xiaoming");
  2. Optional<String> s = optional.flatMap(e -> Optional.of(e.toUpperCase()));
  3. System.out.println(s.get()); //输出:XIAOMING

11.filter

  1. List<String> strings = Arrays.asList("rmb", "doller", "ou");
  2. for (String s : strings) {
  3. Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o"));
  4. System.out.println(o.orElse("没有不包含o的"));
  5. }//输出:
  6. rmb
  7. 没有不包含o
  8. 没有不包含o

四、汇总

  1. public static void main(String[] args) {
  2. /** start:判空 2021/6/3 7:15 下午 */
  3. //1. 集合
  4. List<String> list = new ArrayList<>();
  5. Objects.isNull(list);
  6. list.isEmpty();
  7. //上边两行等价于该行
  8. CollectionUtils.isEmpty(list);
  9. //2. 字符串
  10. /*
  11. <dependency>
  12. <groupId>org.apache.commons</groupId>
  13. <artifactId>commons-lang3</artifactId>
  14. <version>3.4</version>
  15. </dependency>
  16. */
  17. String s = "";
  18. //判断是否为 null 和 size == 0 (带trim效果)推荐使用
  19. StringUtils.isBlank(s);
  20. //判断是否为 null 和 size == 0
  21. StringUtils.isEmpty(s);
  22. /** end:判空 2021/6/3 7:15 下午 */
  23. /** start:相等 2021/6/3 7:16 下午 */
  24. //是否相等
  25. Objects.equals(s,s);
  26. /** end:相等 2021/6/3 7:21 下午 */
  27. /** start:Optional 实例 2021/6/3 7:21 下午 */
  28. //1. of: 为非 null 的值创建一个 Optional。of 方法通过工厂方法创建 Optional 类。需要注意的是,创建对象时传入的参数不能为 null。如果传入参数为 null,则抛出 NullPointerException 。
  29. Optional<String> optional = Optional.of("Hello");
  30. //传入null,抛出NullPointerException
  31. Optional<Object> o = Optional.of(null);
  32. //2. ofNullable: 为指定的值创建一个 Optional,如果指定的值为 null,则返回一个空的 Optional。
  33. Optional<Object> o1 = Optional.ofNullable(null);
  34. //3. isPresent: 值存在返回 true,否则返回 false
  35. Optional<String> o2 = Optional.of("Hello");
  36. System.out.println(o2.isPresent());
  37. //4. get Optional 有值就返回,没有抛出 NoSuchElementException
  38. Optional<Object> o3 = Optional.ofNullable(null);
  39. System.out.println(o3.get());
  40. //5. ifPresent: 如果 Optional 有值则调用 consumer 处理,否则不处理
  41. Optional<Object> o4 = Optional.ofNullable("Hello");
  42. o4.ifPresent(ss -> System.out.println(ss));
  43. //6.orElse: 如果有值则将其返回,否则返回指定的其它值
  44. Optional<Object> o5 = Optional.ofNullable(null);
  45. System.out.println(o1.orElse("输出orElse")); // 输出orElse
  46. //7.orElseGet: orElseGet 与 orElse 方法类似,区别在于得到的默认值。orElse 方法将传入的字符串作为默认值,orElseGet 方法可以接受 Supplier 接口的实现用来生成默认值
  47. /**
  48. * 当 Optional 为空时,orElse 和 orElseGet 区别不大,但当 Optional 有值时,orElse 仍然会去调用方法创建对象,而 orElseGet 不会再调用方法;在我们处理的业务数据量大的时候,这两者的性能就有很大的差异。
  49. */
  50. Optional<Object> o6 = Optional.ofNullable(null);
  51. System.out.println(o1.orElseGet(() -> "default value")); // default value
  52. //8.orElseThrow: 如果有值则将其返回,否则抛出 supplier 接口创建的异常。
  53. Optional<Object> o7 = Optional.ofNullable(null);
  54. try {
  55. o1.orElseThrow(() -> new Exception("异常!"));
  56. } catch (Exception e) {
  57. System.out.println("info:" + e.getMessage());
  58. }//输出:info:异常!
  59. //9.map: 如果有值,则对其执行调用 mapping 函数得到返回值。如果返回值不为 null,则创建包含 mapping 返回值的 Optional 作为 map 方法返回值,否则返回空 Optional。
  60. Optional<String> o8 = Optional.of("xiaoming");
  61. String str = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
  62. System.out.println(str); //输出: XIAOMING
  63. //10.flatMap:如果有值,为其执行 mapping 函数返回 Optional 类型返回值,否则返回空 Optional。与 map 不同的是,flatMap 的返回值必须是 Optional,而 map 的返回值可以是任意的类型 T
  64. Optional<String> o9 = Optional.of("xiaoming");
  65. Optional<String> str1 = optional.flatMap(e -> Optional.of(e.toUpperCase()));
  66. System.out.println(str1.get()); //输出:XIAOMING
  67. //11.filter
  68. List<String> strings = Arrays.asList("rmb", "doller", "ou");
  69. for (String str2 : strings) {
  70. Optional<String> o10 = Optional.of(str2).filter(s1 -> !s1.contains("o"));
  71. System.out.println(o10.orElse("没有不包含o的"));
  72. }
  73. /** end: Optional 实例 2021/6/3 7:21 下午 */
  74. }