如何检查值是否不存在或只是没有价值?
How to check whether value is not present or just has no value?
我是 Java 的新手并且是可选的。这里我有一个未排序的素数数组。
List<Integer> primes = Arrays.asList(3, 7, 5, 2, 13, 11);
int getPrime()
{
primes.sort(); //using Comparator
return (primes.stream()
.filter(prime -> prime>15)
.findFirst()
.orElseThrow(() -> new NoSuchElementException("No such number")));
}
案例 A:我想要 return 第一个素数 > 7 - 效果很好。
情况 B : 我想 return 第一个素数 > 15
情况 C:列表为空/由于某种原因无法访问列表。
如果 B & C ;抛出相同的 NoSuchElementException。完全取不到和能取到但取不到有效数字是有区别的。
我怎样才能更改此代码而又不会太复杂以检查这些情况?
您可以先检查任何元素,否则抛出异常,然后过滤流。
int getPrime() {
if (primes.isEmpty())
throw new NoSuchElementException("Empty list is given.")));
primes.sort(); //using Comparator
return (primes.stream()
.filter(prime -> prime > 15)
.findFirst()
.orElseThrow(() -> new NoSuchElementException("Element could not be found.")));
}
你可以试试
if(primes.size() == 0) throw new MyExcceptionForFailedToFetch();
但是你最好在获取代码时抛出异常。
我希望这可以在不使用流的情况下解决您的问题。
public static void main(String[] args) {
List<Integer> primes = Arrays.asList(3, 7, 5, 2, 13, 11);
if(!primes.isEmpty()) {
Collections.sort(primes);
for(int i : primes) {
if(i > 15) {
System.out.println(i);
break;
}
}
}else {
System.out.println("Empty list is given");
}
}
我不同意你的说法:
There is a difference between totally failing to fetch and being able
to fetch but not get a valid number.
让我解释一下。
异常的准则是方法契约内的行为应产生适当的 return 值,并且方法无法履行其契约的情况会导致异常。
那么,你的方法的“契约”是什么?您希望它 搜索大于给定阈值 的最小素数(至少,我是这么理解的)。我的推理是基于这种抽象。
从数学上讲,这样的质数总是存在的,因此该合约的理想实施总会有一个答案。给定的实现有其局限性,因此在某些情况下它无法履行其合同。在这些情况下,抛出异常是正确的做法。
您列出了两个不同的失败案例,primes
列表为空(或无法访问 - 一种罕见的情况已经抛出自己的异常,因此我们可以在讨论的其余部分忽略它)与。不包含大于您的阈值的素数的列表。
两个我,这个区别并不重要。在这两种情况下,primes
列表对于请求的阈值来说都太短了,零元素只是“太短”的极端情况。在这两种情况下,return 一个值都是错误的,相反,应该抛出一个异常,这样调用者就知道问题没有得到回答。你已经在这样做了。
调用者可能对失败的原因感兴趣(大多数时候,他只需要知道调用失败而不关心原因)。这在异常类型及其消息中表示。根据我的理解,NoSuchElementException
不是最能表达失败原因的选择。它是 documented 作为“由各种访问器方法抛出以指示所请求的元素不存在”。在 搜索大于给定阈值的最小素数的上下文中 我可以想象应用该规范的两种不同解释:
- “元素”表示数学素数。正如我们所说,它肯定存在,所以我们会得到一个错误的陈述“抛出......以表明下一个更高的素数不存在。”
- “元素”表示素数列表中的元素。那么该语句是正确的(“抛出...以指示素数列表中的适当元素不存在”)。但这与调用者无关,因为它讨论了调用者甚至不应该知道的一些实现细节:该方法在其计算中使用预定义的 prime-numbers 列表这一事实。
我更喜欢 UnsupportedOperationException
(documented 作为“抛出以指示请求的操作不受支持。”,在我看来,这与失败完全匹配。
所以,我唯一要更改的代码是抛出 new UnsupportedOperationException("primes list too short")
而不是 NoSuchElementException
。
我是 Java 的新手并且是可选的。这里我有一个未排序的素数数组。
List<Integer> primes = Arrays.asList(3, 7, 5, 2, 13, 11);
int getPrime()
{
primes.sort(); //using Comparator
return (primes.stream()
.filter(prime -> prime>15)
.findFirst()
.orElseThrow(() -> new NoSuchElementException("No such number")));
}
案例 A:我想要 return 第一个素数 > 7 - 效果很好。
情况 B : 我想 return 第一个素数 > 15
情况 C:列表为空/由于某种原因无法访问列表。
如果 B & C ;抛出相同的 NoSuchElementException。完全取不到和能取到但取不到有效数字是有区别的。
我怎样才能更改此代码而又不会太复杂以检查这些情况?
您可以先检查任何元素,否则抛出异常,然后过滤流。
int getPrime() {
if (primes.isEmpty())
throw new NoSuchElementException("Empty list is given.")));
primes.sort(); //using Comparator
return (primes.stream()
.filter(prime -> prime > 15)
.findFirst()
.orElseThrow(() -> new NoSuchElementException("Element could not be found.")));
}
你可以试试
if(primes.size() == 0) throw new MyExcceptionForFailedToFetch();
但是你最好在获取代码时抛出异常。
我希望这可以在不使用流的情况下解决您的问题。
public static void main(String[] args) {
List<Integer> primes = Arrays.asList(3, 7, 5, 2, 13, 11);
if(!primes.isEmpty()) {
Collections.sort(primes);
for(int i : primes) {
if(i > 15) {
System.out.println(i);
break;
}
}
}else {
System.out.println("Empty list is given");
}
}
我不同意你的说法:
There is a difference between totally failing to fetch and being able to fetch but not get a valid number.
让我解释一下。
异常的准则是方法契约内的行为应产生适当的 return 值,并且方法无法履行其契约的情况会导致异常。
那么,你的方法的“契约”是什么?您希望它 搜索大于给定阈值 的最小素数(至少,我是这么理解的)。我的推理是基于这种抽象。
从数学上讲,这样的质数总是存在的,因此该合约的理想实施总会有一个答案。给定的实现有其局限性,因此在某些情况下它无法履行其合同。在这些情况下,抛出异常是正确的做法。
您列出了两个不同的失败案例,primes
列表为空(或无法访问 - 一种罕见的情况已经抛出自己的异常,因此我们可以在讨论的其余部分忽略它)与。不包含大于您的阈值的素数的列表。
两个我,这个区别并不重要。在这两种情况下,primes
列表对于请求的阈值来说都太短了,零元素只是“太短”的极端情况。在这两种情况下,return 一个值都是错误的,相反,应该抛出一个异常,这样调用者就知道问题没有得到回答。你已经在这样做了。
调用者可能对失败的原因感兴趣(大多数时候,他只需要知道调用失败而不关心原因)。这在异常类型及其消息中表示。根据我的理解,NoSuchElementException
不是最能表达失败原因的选择。它是 documented 作为“由各种访问器方法抛出以指示所请求的元素不存在”。在 搜索大于给定阈值的最小素数的上下文中 我可以想象应用该规范的两种不同解释:
- “元素”表示数学素数。正如我们所说,它肯定存在,所以我们会得到一个错误的陈述“抛出......以表明下一个更高的素数不存在。”
- “元素”表示素数列表中的元素。那么该语句是正确的(“抛出...以指示素数列表中的适当元素不存在”)。但这与调用者无关,因为它讨论了调用者甚至不应该知道的一些实现细节:该方法在其计算中使用预定义的 prime-numbers 列表这一事实。
我更喜欢 UnsupportedOperationException
(documented 作为“抛出以指示请求的操作不受支持。”,在我看来,这与失败完全匹配。
所以,我唯一要更改的代码是抛出 new UnsupportedOperationException("primes list too short")
而不是 NoSuchElementException
。