我有一个方法,它接受一个内部有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()
或带有链接的流,所以我可以在一行链接中完成。
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: