热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java8:流findFirst结果

如何解决《Java8:流findFirst结果》经验,为你挑选了3个好方法。

我想知道有没有办法摆脱警告findFirst().get()而不使用.orElse()如果我100%知道每次都有结果,所以我永远不会到达那里NoSuchElementException.例如,让我们看看以下代码:

    List myList = new ArrayList<>();
    myList.add("Test");
    myList.add("Example");
    myList.add("Sth");

    String fisrstString = myList.stream().findFirst().get(); // here I surely get "Test" 

我不知道其他IDE如何对待它,但是我的IDE(IntelliJ)将其视为警告('Optional.get()' without 'isPresent()').我想可能它不知道你何时可以到达NoSuchElementException那里,何时不到,或者我不知道为什么.我知道有办法解决这个警告(isPresent()检查.orElse(something)),但有无用的代码,所以我不想使用这些解决方案,因为它们是如此不必要.你知道我该怎么做,或解释这是怎么回事?

编辑:对不起NPE,它有NoSuchElementException我的错误,但我认为这个问题仍然存在.



1> Sergii Bishy..:

好吧,对我来说,最好的方法是使用功能编程并继续使用可选项.因此,例如,如果您需要将此字符串传递给某个服务,您可以执行以下操作:

String fisrstString = myList.stream().findFirst().get();
service.doSomething(fisrstString);

但这看起来并不那么好.相反,你可以使用功能编程的优点,并做:

myList.stream().findFirst().ifPresent(service::doSomething);


@Sunflame"可选"的monad的概念来自函数式编程.所以对我而言,这种情况下FP的优点更好
@Sunflame您可以将结果传递给`ifPresent`中的方法.`.ifPresent(结果 - > doSomething(result));`
我使用了你的sollution,还有一个&#39;ifPresent`检查为null.目前我认为这是最好的解决方案,因为我不需要添加任何额外的未使用的值,如`.orElse(StringUtils.EMPTY)`或类似的东西

2> Eugene..:

首先你不会得到一个NPE,但是一个NoSuchElementException.其次,可能是肯定的; 但其他人可能出现并没有意识到这不会引发异常.

对于沙箱项目 - 是的,你不会关心,可以忽略警告; 对于生产代码,我不会禁用它(即使你可以).

最后一点是,如果你这么肯定,为什么不抛出异常呢?

orElseThrow(IAmSureThisWillNotHappenException::new)


你也可以在这里抛出一个`AssertionError`

3> Federico Per..:

您应该使用Optional返回的findFirst()而不是尝试获取其值(如果它实际存在).

myList.stream()
    .findFirst()
    .ifPresent(/* consume the string here, if present */);

Optional.ifPresent方法接收Consumer将用来只有当Optional含有非空值.

问题是我们Java开发人员已经习惯了命令式范例......特别是,我们习惯于获取一个对象并将其送到一个方法:

String myString = "hello"; // getting an object here

System.out.println(myString); // pushing the object to System.out here
                              // (via the println method)

随着Optional返回的Stream.findFirst()你在做与上面相同:

String myString = myList.stream()
    .findFirst()
    .get(); // getting a string here

System.out.println(myString); // pushing the string here

另一方面,功能范例(包括Optional)通常以另一种方式工作:

myList.stream()
    .findFirst()
    .ifPresent(myString -> System.out.println(myString));

在这里,你没有获得字符串,然后将其推送到某个方法.相反,你提供的参数OptionalifPresent操作,让执行Optional推价值,你的论点.换句话说,你通过's参数拉出包裹的值.然后,只有当值存在时才会使用此参数.OptionalifPresentifPresentConsumer

这种拉动模式在函数式编程中很常见,一旦你习惯它就非常有用.它只需要我们的开发人员以不同的方式开始思考(和编程).


@maaartinus现在我对&#39;ifPresent`有所了解.`Optional`更适合Java 9中的任务,即它有`ifPresentOrElse`和`或`允许链``Optional`s等等
推荐阅读
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 本文探讨了如何在 Java 中将多参数方法通过 Lambda 表达式传递给一个接受 List 的 Function。具体分析了 `OrderUtil` 类中的 `runInBatches` 方法及其使用场景。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
author-avatar
mobiledu2502897083
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有