如何使用 Java StreamAPI 处理 NumberFormatException
How to handle NumberFormatException with Java StreamAPI
有没有办法使用 Stream API 过滤掉所有大于可以存储在 Long
中的最大值的值?
目前的情况是,您可以在前端使用简单的搜索栏在一些客户之后使用他们的 ID 进行搜索。
例如:123456789, 10987654321.
如果在这两个 ID 之间放置一个 “分隔符”,一切正常。但是,如果您忘记了 "separator",我的代码试图将 12345678910987654321
解析为 Long,我想这就是问题所在。
尝试搜索后会导致 NumberFormatException
。有没有办法过滤掉这些因太大而无法解析为 Long
的数字?
String hyphen = "-";
String[] customerIds = bulkCustomerIdProperty.getValue()
.replaceAll("[^0-9]", hyphen)
.split(hyphen);
...
customerFilter.setCustomerIds(Arrays.asList(customerIds).stream()
.filter(n -> !n.isEmpty())
.map(n -> Long.valueOf(n)) // convert to Long
.collect(Collectors.toSet()));
也许你可以添加另一个过滤器,例如
.filter((n) -> { return new BigInteger(n).compareTo(new BigInteger(String.valueOf(Long.MAX_VALUE))) <= 0;})
您也可以使用 try/catch 在发生这种情况时抛出错误并通知您的前端
您可以将解析提取到单独的方法中并用 try/catch
包装它,或者使用 BigInteger
来消除超出 long
.[=19= 范围的值]
示例BigInteger
:
Set<Long> result = Stream.of("", "12345", "9999999999999999999999999999")
.filter(n -> !n.isEmpty())
.map(BigInteger::new)
.filter(n -> n.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) <= 0 &&
n.compareTo(BigInteger.valueOf(Long.MIN_VALUE)) >= 0)
.map(BigInteger::longValueExact) // convert to Long
.peek(System.out::println) // printing the output
.collect(Collectors.toSet());
在单独的方法中处理 NumberFormatException
的示例:
Set<Long> result = Stream.of("", "12345", "9999999999999999999999999999")
.filter(n -> !n.isEmpty())
.map(n -> safeParse(n))
.filter(OptionalLong::isPresent)
.map(OptionalLong::getAsLong) // extracting long primitive and boxing it into Long
.peek(System.out::println) // printing the output
.collect(Collectors.toSet());
public static OptionalLong safeParse(String candidate) {
try {
return OptionalLong.of(Long.parseLong(candidate));
} catch (NumberFormatException e) {
return OptionalLong.empty();
}
}
输出(来自peek()
)
12345
有没有办法使用 Stream API 过滤掉所有大于可以存储在 Long
中的最大值的值?
目前的情况是,您可以在前端使用简单的搜索栏在一些客户之后使用他们的 ID 进行搜索。
例如:123456789, 10987654321.
如果在这两个 ID 之间放置一个 “分隔符”,一切正常。但是,如果您忘记了 "separator",我的代码试图将 12345678910987654321
解析为 Long,我想这就是问题所在。
尝试搜索后会导致 NumberFormatException
。有没有办法过滤掉这些因太大而无法解析为 Long
的数字?
String hyphen = "-";
String[] customerIds = bulkCustomerIdProperty.getValue()
.replaceAll("[^0-9]", hyphen)
.split(hyphen);
...
customerFilter.setCustomerIds(Arrays.asList(customerIds).stream()
.filter(n -> !n.isEmpty())
.map(n -> Long.valueOf(n)) // convert to Long
.collect(Collectors.toSet()));
也许你可以添加另一个过滤器,例如
.filter((n) -> { return new BigInteger(n).compareTo(new BigInteger(String.valueOf(Long.MAX_VALUE))) <= 0;})
您也可以使用 try/catch 在发生这种情况时抛出错误并通知您的前端
您可以将解析提取到单独的方法中并用 try/catch
包装它,或者使用 BigInteger
来消除超出 long
.[=19= 范围的值]
示例BigInteger
:
Set<Long> result = Stream.of("", "12345", "9999999999999999999999999999")
.filter(n -> !n.isEmpty())
.map(BigInteger::new)
.filter(n -> n.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) <= 0 &&
n.compareTo(BigInteger.valueOf(Long.MIN_VALUE)) >= 0)
.map(BigInteger::longValueExact) // convert to Long
.peek(System.out::println) // printing the output
.collect(Collectors.toSet());
在单独的方法中处理 NumberFormatException
的示例:
Set<Long> result = Stream.of("", "12345", "9999999999999999999999999999")
.filter(n -> !n.isEmpty())
.map(n -> safeParse(n))
.filter(OptionalLong::isPresent)
.map(OptionalLong::getAsLong) // extracting long primitive and boxing it into Long
.peek(System.out::println) // printing the output
.collect(Collectors.toSet());
public static OptionalLong safeParse(String candidate) {
try {
return OptionalLong.of(Long.parseLong(candidate));
} catch (NumberFormatException e) {
return OptionalLong.empty();
}
}
输出(来自peek()
)
12345