当前位置: 首页 > 知识库问答 >
问题:

使用 Java 8 可选字符串列表作为输出

端木权
2023-03-14

我想对返回 List 的方法使用 Optional

假设函数是

public Output getListOfSomething() {
    // In some cases there is nothing to return and hence it makes sense to have return 
    // type as Optional here
}

因此,该函数如下所示:

public Optional<List<String>> getListOfSomething() {
    // return something only when there is some valid list
}

现在我想做一些事情,如果列表存在,所以像这样:

Optional<List<String>> listOfSomething = getListOfSomething();

int size = 0;

listOfSomething.ifPresent(size = listOfSomething.get().size());

我是Optional的新手,已经浏览了关于Optional的文章,看起来这应该可以,但是我在IDE中遇到了语法错误:

方法ifPresent不适用于参数(无效)。

我想从那些可能更熟悉java 8中lamdas的开发人员那里获得一些帮助。

共有3个答案

郭兴文
2023-03-14

ifPresent需要一个消费者界面才能工作。您可以执行以下操作:

Optional<List<String>> listOfSomething = getListOfSomething();
Integer[] size = {0};
listOfSomething.ifPresent(list -> size[0]=list.size())

但正如Tagir Valeev所说,最好这样做:

size = listOfSomething.map(List::size).orElse(0);

最好返回一个空列表,甚至可能返回一个流。

鲜于裕
2023-03-14

真正的函数式编程方式如下:

size = listOfSomething.map(List::size).orElse(0);

但是,最好返回空列表而不是可选

景阳平
2023-03-14

考虑这里的语义很重要。

您的方法可以返回列表或“无列表”。

如果它返回一个列表,它可能返回一个空列表。

你应该问,“是否有语义上的原因来区分空列表和无列表?”有时候,有一个很好的设计理由可以让它与众不同,但这是很少见的。在确定空和空在您的情况下是不同的之前,请仔细考虑。避免不列出的部分原因是,它减少了客户端代码必须考虑的“特殊情况”。例如,如果他们必须对返回的每个项执行某些操作,但您也可以返回null,那么他们必须在进入For-each循环之前对null进行特殊检查。如果列表为空,则for-each不起任何作用。

如果问题域中的“无列表”不同于“空列表”,那么有时返回帮助客户端代码区分这些条件并适当处理它们的包装类是有用的。可选就是这样一个泛型类,但您的域可能需要更具体的东西(即使它模仿了可选的功能,它也可能具有更好的语义定义)。

 类似资料:
  • 问题内容: 我是Java的新手,我不太确定如何将整数加幂作为字符串输出。我知道 实际上会计算出将双精度数提高到幂的值。但是,如果我想输出“ 2 ^ 6”作为输出(除了6作为上标而不是克拉),我该怎么做? 编辑:这是一个Android应用程序。我以整数形式传递给幂的整数,我想知道如何在手机的UI中将其转换为上标。 问题答案: 如果要将文本输出到GUI,则可以使用HTML格式和标记获取上标。否则,您将

  • 我最近开始处理Java流。我试图从我的一个SQL查询的结果集中获取字符串值。结果集只从数据库中选择一个字符串/Varchar列。 所以我做了: 或: 我相信地图具有将数据从一种类型转换为另一种类型的功能。在本例中,从对象到字符串,然后在字符串列表中收集它们。 但上面的代码显示了编译时错误:无法从对象转换为字符串列表。 请给我建议正确的做法,并说明我的理解有什么问题。

  • 问题内容: 有什么办法包装UTF-8列表吗?我想做类似的事情: 问题答案: 您可以将所有行连接在一起以创建一个String,然后使用将其转换为字节数组并将其传递到ByteArrayInputStream。但是,这不是最有效的方法。

  • 在我的一些项目中,我经常使用do-thin-check NextForNull-getNext循环模式(不知道它是否有官方名称)。但是在Java8中,与检查客户端代码中的空引用相比,使用可选被认为是更干净的代码。但是当在这种循环模式中使用可选时,代码会变得有点冗长和丑陋,但是因为可选有一些方便的方法,我希望一定存在比我下面提出的更干净的方法。 示例: 考虑到下面的课程。 其中第一个项目的nr==1

  • 问题内容: 想知道有没有比如下计算给定字符串的字符数更简单的方法? 问题答案: 具有完全的Unicode支持(Java 11+)1的最简单的方法来计算字符串中每个字符的出现次数: 1)答案的结尾是具有完整Unicode支持的Java 8版本。 输出量 更新: 对于Java 8+(不支持补充平面中的字符,例如emoji): 更新2: 同样适用于Java 8+。 我误会了,以为它是在Java 9之前才

  • 我使用的是Avro版本1.10.2 我有以下模式,作为可选JSON字符串: 我使用Avro Maven插件来执行代码生成。 但是,当我使用以下代码对此对象的实例进行编码时: 输出为: 而不是我所期望的: 据我所知,Avro规范中似乎没有任何内容暗示只有记录可以是可选的。此外,根据工会: 如上所述,联合是使用JSON数组表示的。例如,[“null”,“string”]声明一个模式,该模式可以是nul