爪哇2博客
爪哇2博客

爪哇 8可选

爪哇 8可选

在这篇文章中,我们将看到有关Java 8可选的内容。


你有没有得到 空指针异常 作为Java开发人员?如果您是经验丰富的Java开发人员,则有时可能会遇到NullPointerException。
您可能同意NullPointerException是新手或专家的痛苦 核心Java 开发人员。为了避免NullPointerException,您必须放置很多防御性代码。
让’借助示例进行查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
组织.Arpit.爪哇2blog;
 
上市 雇员 {
    私人的 名称;
    私人的 整型 年龄;
 
    上市 雇员( 名称, 整型 年龄) {
        ();
        这个.名称 = 名称;
        这个.年龄 = 年龄;
    }
    上市 得到Name() {
        返回 名称;
    }
    上市 虚空 setName( 名称) {
        这个.名称 = 名称;
    }
    上市 整型 得到Age() {
        返回 年龄;
    }
    上市 虚空 setAge(整型 年龄) {
        这个.年龄 = 年龄;
    }
}
 

Create a 主要 类 名称d "JavaFindEmployeeMain.java"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
组织.Arpit.爪哇2blog;
 
进口 爪哇.实用程序.数组列表;
进口 爪哇.实用程序.清单;
 
上市 爪哇FindEmployeeMain {
 
    上市 静态的 虚空 主要([] args)
    {
        清单<雇员> 员工名单 = createEmployeeList();
        雇员 雇员 = findEmployee(员工名单,"亚当");
        系统..打印(“员工姓名: ”+雇员.得到Name());
    }
 
    上市 静态的 雇员 findEmployee(清单<雇员> 员工名单, 名称)
    {
        对于(雇员 e:员工名单)
        {
            如果 (e.得到Name().equalsIgnoreCase(名称))
            {
                返回 e;
            }
        }
        返回 空值;
    }
    上市 静态的 清单<雇员> createEmployeeList()
    {
        清单<雇员> 员工名单= 数组列表<>();
 
        雇员 e1= 雇员(“约翰”,21);
        雇员 e2= 雇员(“马丁”,22);
        雇员 e3= 雇员(“玛丽”,31);
        雇员 e4= 雇员(“斯蒂芬”,18);
        雇员 e5= 雇员(加里,26);
 
        员工名单.(e1);
        员工名单.(e2);
        员工名单.(e3);
        员工名单.(e4);
        员工名单.(e5);
 
        返回 员工名单;
 
    }
}
 

当您运行上述程序时,将获得以下输出:

线程异常“main”java.lang.NullPointerException
在org.arpit.java2blog.JavaOptionalMain.main(JavaOptionalMain.java:12)

如你看到的,"Adam"在employeeList中不存在,’s为什么我们在这里得到NullPointerException。

您在这里看到问题了吗?当我们尝试在列表中查找员工时,我们忘记了检查null。当您调用库函数并且返回null并忘记对其进行检查时,这种情况会更经常发生。


爪哇 8可选

您可以使用Optional解决此问题。你可以改变"JavaOptionalMain" as below.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
组织.Arpit.爪哇2blog;
 
进口 爪哇.实用程序.数组列表;
进口 爪哇.实用程序.清单;
进口 爪哇.实用程序.可选的;
 
上市 爪哇OptionalMain {
 
    上市 静态的 虚空 主要([] args)
    {
        清单<雇员> 员工名单 = createEmployeeList();
        可选的<雇员> 雇员Opt = findEmployee(员工名单,"亚当");
        如果 (雇员Opt.存在())
        {
            雇员 雇员 = 雇员Opt.得到();
            系统..打印(“员工姓名: ”+雇员.得到Name());
        }
        其他
        {
            系统..打印("There is no 雇员 with 名称 亚当");
        }
    }
 
    上市 静态的 可选的<雇员> findEmployee(清单<雇员> 员工名单, 名称)
    {
        对于(雇员 e:员工名单)
        {
            如果 (e.得到Name().equalsIgnoreCase(名称))
            {
                返回 可选的.(e);
            }
        }
        返回 可选的.空的();
    }
    上市 静态的 清单<雇员> createEmployeeList()
    {
        清单<雇员> 员工名单= 数组列表<>();
 
        雇员 e1= 雇员(“约翰”,21);
        雇员 e2= 雇员(“马丁”,22);
        雇员 e3= 雇员(“玛丽”,31);
        雇员 e4= 雇员(“斯蒂芬”,18);
        雇员 e5= 雇员(加里,26);
 
        员工名单.(e1);
        员工名单.(e2);
        员工名单.(e3);
        员工名单.(e4);
        员工名单.(e5);
 
        返回 员工名单;
    }
}
 

当您运行上述程序时,将获得以下输出:

There is no 雇员 with 名称 亚当

您可能会认为您也可以在JavaFindEmployeeMain中处理null,但是当您从竞彩篮球分析返回Optional时,这意味着可以从竞彩篮球分析中期望缺少值。

可选的Java 8


创建可选竞彩篮球分析

有多种创建可选的竞彩篮球分析。

空可选

您可以使用静态工厂竞彩篮球分析创建空的可选对象"empty"

1
2
3
 
可选的<雇员> optCar = 可选的.空的();
 

非空值的可选

您可以使用静态工厂竞彩篮球分析从非空值创建Optional"of"

1
2
3
 
可选的<雇员> optCar = 可选的.(雇员);
 

如果employee为null,则上述竞彩篮球分析将抛出NullPointerException。

从null值或非null值中可选

您可以使用静态工厂竞彩篮球分析从null或非null值创建Optional"ofNullable"

1
2
3
 
可选的<雇员> optCar = 可选的.空值(雇员);
 


从可选获得价值

您可以使用get()竞彩篮球分析从Optional检索值,但这是最不安全的竞彩篮球分析。如果不存在value,则它将引发NoSuchElementException,因此您需要确保在调用get()竞彩篮球分析之前调用isPresent()竞彩篮球分析。


检查可选中的值

您可以使用isPresent竞彩篮球分析检查Optional中是否包装了值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
    上市 静态的 虚空 主要([] args)
    {
            清单<雇员> 员工名单 = createEmployeeList();
        可选的<雇员> 雇员Opt = findEmployee(员工名单,"亚当");
        如果 (雇员Opt.存在())
        {
            雇员 雇员 = 雇员Opt.得到();
            系统..打印(“员工姓名: ”+雇员.得到Name());
        }
        其他
        {
            系统..打印("There is no 雇员 with 名称 亚当");
        }
    }
 


可选中的条件操作

如果Optional中存在值,则可以使用ifPresent竞彩篮球分析执行操作。
Change 主要 method in 爪哇OptionalMain as below

1
2
3
4
5
6
7
8
9
10
11
12
 
    上市 静态的 虚空 主要([] args)
    {
        清单<雇员> 员工名单 = createEmployeeList();
        可选的<雇员> 雇员Opt1 = findEmployee(员工名单,"亚当");
        可选的<雇员> 雇员Opt2 = findEmployee(员工名单,“约翰”);
 
        雇员Opt1.如果存在((雇员)->系统..打印(“员工姓名: ”+雇员.得到Name()+“在列表中找到”));
        雇员Opt2.如果存在((雇员)->系统..打印(“员工姓名: ”+雇员.得到Name()+“在列表中找到”));
 
    }
 

运行该程序时,将获得以下输出:

员工名称:假人
员工姓名:John在列表中

如您在此处看到的,如果列表中存在员工姓名,则只有我们正在打印员工姓名,否则它不会执行任何操作。


可选使用orElse中的默认值

如果使用orElse竞彩篮球分析在Optional中没有值,则可以返回默认值。
Change 主要 method in 爪哇OptionalMain as below

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
    上市 静态的 虚空 主要([] args)
    {
        清单<雇员> 员工名单 = createEmployeeList();
        可选的<雇员> 雇员Opt = findEmployee(员工名单,"亚当");
        雇员 员工1 = 雇员Opt.要不然( 雇员(“假”,0));
        系统..打印(“员工姓名: ”+员工1.得到Name());
 
        可选的<雇员> 雇员Opt2 = findEmployee(员工名单,“马丁”);
        雇员 员工2= 雇员Opt2.要不然( 雇员(“假”,0));
        系统..打印(“员工姓名: ”+员工2.得到Name());
 
    }
 

运行该程序时,将获得以下输出:

员工名称:假人
员工姓名:马丁

请注意,即使“可选”中存在值,也会默认使用默认对象。


可选使用orElseGet的默认值

或其他是orElse的懒惰计数器部分。 供应商 作为参数,并且仅当Optional中不存在value时才调用。
Change 主要 method in 爪哇OptionalMain as below

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
    上市 静态的 虚空 主要([] args)
    {
        清单<雇员> 员工名单 = createEmployeeList();
        可选的<雇员> 雇员Opt = findEmployee(员工名单,"亚当");
        雇员 员工1 = 雇员Opt.或其他(()-> 雇员(“假”,0));
        系统..打印(“员工姓名: ”+员工1.得到Name());
 
        可选的<雇员> 雇员Opt2 = findEmployee(员工名单,“马丁”);
        雇员 员工2 = 雇员Opt2.或其他(()-> 雇员(“假”,0));
        系统..打印(“员工姓名: ”+员工2.得到Name());
 
    }
 

运行该程序时,将获得以下输出:

员工名称:假人
员工姓名:马丁

可选的抛出异常

如果Optional为空,则可以使用orElseThrow引发异常。它类似于get()竞彩篮球分析,但是在这种情况下,您可以选择抛出比NoSuchMethodException异常更多的异常。
Change 主要 method in 爪哇OptionalMain as below

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
    上市 静态的 虚空 主要([] args)
    {
        清单<雇员> 员工名单 = createEmployeeList();
        可选的<雇员> 雇员Opt = findEmployee(员工名单,"亚当");
        雇员 员工1 = 雇员Opt.否则(() -> RuntimeException(“找不到员工”));
        系统..打印(“员工姓名: ”+员工1.得到Name());
 
        可选的<雇员> 雇员Opt2 = findEmployee(员工名单,“马丁”);
        雇员 员工2 = 雇员Opt2.否则(() -> RuntimeException(“找不到员工”));
        系统..打印(“员工姓名: ”+员工2.得到Name());
 
    }
 

在Java 8 API中使用Optional

爪哇 8 API中Optional的用法很多,下面我举一个例子。
流.findFirst()竞彩篮球分析返回此流的第一个元素的Optional,如果流为空,则返回空的Optional。

那’关于Optional in的全部内容 爪哇 8.

学习愉快!


导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

  • 在Java中将日期转换为LocalDate
    1月12日

    爪哇日期到LocalDate

    在这篇文章中,我们将看到如何在Java中将Date转换为LocalDate。有时,我们可能需要将Date转换为新的Java 8 API,反之亦然。在Java中,有多种将Date转换为LocalDate的竞彩篮球分析。另请参见:使用Date类的[InInstant()竞彩篮球分析将Java中的LocalDate转换为Date…]

  • 在Java中将LocalDate转换为Date
    1月11日

    迄今为止的Java LocalDate

    在这篇文章中,我们将看到如何将LocalDate转换为Date。 爪哇 8引入了许多有关日期和时间的新API。有多种竞彩篮球分析可以将Java LocalDateTime转换为日期。使用Instant对象您可以使用来自Zone的Instant对象将LocalDate转换为Date。这是 […]

  • 将流转换为Java中的列表
    12月31日

    爪哇流列表

    在本文中,我们将看到如何在Java中将Stream转换为List。在Java中,有多种竞彩篮球分析可以将Stream转换为List。使用Collectors.toList()可以将Collectors.toList()传递给Stream.collect()竞彩篮球分析,以在Java中将Stream转换为List。流’的collect竞彩篮球分析对Stream和Collectors的元素执行可变的约简操作。toList()提供[…]

  • 在Java中将LocalDateTime转换为时间戳
    11月18日

    在Java中将LocalDateTime转换为时间戳

    在本文中,我们将如何将LocalDateTime转换为Timestamp。在学习如何将localdatetime转换为时间戳之前,让我们了解LocalDateTime和Timestamp,并了解这种转换的重要性。 LocalDateTime LocalDateTime在Java 8中已引入。LocalDateTime可以导入时间包:import 爪哇.time.LocalDateTime; LocalDateTime是使用的不可变对象[…]

  • 8月28日

    爪哇 8流 API深入指南

    在这篇文章中,我们将看到Java 8流的深入概述,其中包含许多示例和练习。简介您可能认为Stream必须类似于InputStream或OutputStream,但是’并非如此。流表示支持顺序和并行聚合操作的一系列元素。流不存储[…]

  • 要映射的Java流列表
    4月26日

    要映射的Java流列表

    在本文中,我们将看到如何在Java 8中使用Stream将List转换为Map。’s toMap()可与Stream一起使用,以在Java中将List转换为Map。考虑一个名为Movie的类,它具有3个字段–ID,名称和流派[crayon-601ecd3b2b017653578206 /]创建电影列表并将其转换为[…]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


让’s be Friends

©2020 爪哇2博客