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

如何从流可以为空的对象返回可为空的列表

潘俊
2023-03-14

我有一个方法,它接受一个内部有ArrayList的对象:

private List<String> getWatchlistDetail(MatchData k) {
        if(k == null)
            return new ArrayList<>();
        return
                k.getWatchListDetail()
                        .stream()
                        .collect(Collectors.toList());
    }

MatchData k可以是null,有时k.getWatchListDetail()也可以是null。

我需要检查两种情况。首先,如果它能抛出NPE。

上面的实现可以做到这一点,但我尝试使用可选。ofNullable()或带有链接的流,所以我可以在一行链接中完成。

共有1个答案

郑嘉年
2023-03-14

MatchData k是null,有时k.getWatchListDetail()也是null,所以我需要检查两者

...所以我可以用一条链子来做。

当然,您可以在一条stream语句中同时检查这两条语句。

private List<String> getWatchlistDetail(MatchData k) {
    
    return Stream.ofNullable(k)
        .map(MatchData::getWatchListDetail)
        .filter(Objects::nonNull)
        .flatMap(List::stream)
        .collect(Collectors.toList());
}

但是,请记住:

  • 这不是补救措施,而是试图隐藏设计缺陷

现在将其与下面的方法进行比较,该方法既不隐藏空检查,也不滥用流,并且是可选的:

private List<String> getWatchlistDetail(MatchData k) {
    
    return k != null && k.getWatchListDetail() != null ?
           k.getWatchListDetail() : Collections.emptyList();
}

Java引入函数式编程是为了降低代码的复杂性,而不是相反,仅将其用于隐藏空检查不会让您感到任何困难。

就其本身而言,空检查不是问题,而只是问题的一个指示器。为了解决这个问题,需要改进应用程序的设计。

使用可选。不可用的

关于是否可以使用可选来避免条件逻辑的问题,请看@StuartMarks(JDK开发人员)的回答:

可选的主要用途如下:

可选旨在为库方法返回类型提供一种有限的机制,其中显然需要表示“无结果”,并且为此使用null极有可能导致错误。

典型的代码味道是,它不是使用方法链接来处理从某个方法返回的可选项,而是从可为null的内容创建可选项,以链接方法并避免条件。

 类似资料:
  • 需要筛选一个项目列表并检查item.discount()<=0,以防没有找到返回可选对象类型。 这是一个为列表添加值的代码,但我不知道如果列表是空的,如何获得可选对象

  • 问题内容: 在获取流之前进行空检查的最佳/惯用方式是什么? 我有接收可能为空的方法。因此,我不能只调用传入的值。如果值为null,是否有一些静态助手会给我一个空的流? 问题答案: 我同意Stuart Marks的观点,这是执行此操作的正确方法(请参见他的回答),或者至少是在Java 9之前的版本中进行此操作的正确方法(请参见下面的编辑),但是我将保留此答案以演示对可选API。 编辑: Java 9

  • 我喜欢现在Java标准库中的选项。但有一个基本问题我一直碰到,但我还没想好如何用最好的(最容易读懂、最漂亮、最短的)方法解决: 当选项为空时如何从方法返回? 如果可选项为空,我如何从方法返回,而不必在方法的其余部分中使用,也不必声明额外的变量和额外的块嵌套级别? 或者如果不可能得到所有这些,那么处理这种情况的最佳方法是什么?

  • 问题内容: 在浏览一些旧代码时,我遇到了这个宝石: 第二行在Eclipse中被标记为无效代码,我知道为什么。似乎没有明确抛出任何异常,并且构造函数不可能抛出任何类型的异常(例如)。 我的问题是 为什么 要进行空检查?以前在Java的旧版本中,构造函数是否可以返回null?还是这仅仅是毫无用处的代码? 问题答案: 该代码在任何Java版本中均无效。构造函数不可能返回,即使构造函数会抛出异常,也不会调

  • 我在C#中创建了一个立方矩阵类来存储三维项目。我需要能够添加和删除项目,这就是为什么我使用对象?(我已经明白了不能使用可为空的泛型,即t?)。然而,这种方法可能会出错 类型参数声明必须是标识符,而不是类型 如果我不使用Object?不过,只要使用Object或T,我就会得到这个错误 无法将null转换为类型参数“T”,因为它可能是不可为null的值类型。考虑使用“默认”(t)。 在这种情况下,正确

  • 我试图模拟一个对象,该对象返回一个带有Mockito的Java可选对象: 当被调用,它返回。 我希望方法返回 返回的任何原因? 方法如下: 以下是Junit: