gpt4 book ai didi

java - 使用流处理异常

转载 作者:行者123 更新时间:2023-12-02 09:37:13 26 4
gpt4 key购买 nike

我有一个Map<String,List<String>>并希望它变成Map<String,List<Long>>因为每个 String列表中代表 Long :

Map<String,List<String>> input = ...;
Map<String,List<Long>> output=
input.entrySet()
.stream()
.collect(toMap(Entry::getKey, e -> e.getValue().stream()
.map(Long::valueOf)
.collect(toList()))
);

我的主要问题是每个 String可能无法正确表示Long ;可能有一些问题。 Long::valueOf可能会引发异常。如果是这种情况,我想返回 null 或空 Map<String,List<Long>>

因为我想在这个 output 之后进行迭代 map 。但我不能接受任何错误的转换;连一个也没有。知道如何在字符串 -> 长转换不正确的情况下返回空输出吗?

最佳答案

我个人喜欢提供Optional围绕数字解析输入:

public static Optional<Long> parseLong(String input) {
try {
return Optional.of(Long.parseLong(input));
} catch (NumberFormatException ex) {
return Optional.empty();
}
}

然后,使用您自己的代码(并忽略错误的输入):

Map<String,List<String>> input = ...;
Map<String,List<Long>> output=
input.entrySet()
.stream()
.collect(toMap(Entry::getKey, e -> e.getValue().stream()
.map(MyClass::parseLong)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toList()))
);

此外,考虑一个辅助方法来使其更加简洁:

public static List<Long> convertList(List<String> input) {
return input.stream()
.map(MyClass::parseLong).filter(Optional::isPresent).map(Optional::get)
.collect(Collectors.toList());
}

public static List<Long> convertEntry(Map.Entry<String, List<String>> entry) {
return MyClass.convertList(entry.getValue());
}

然后您可以在流收集器中过滤结果:

Map<String, List<Long>> converted = input.entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, MyClass::convertEntry));

您也可以保留空 Optional列表中的对象,然后比较它们在新 List<Optional<Long>> 中的索引(而不是 List<Long> )与原来的 List<String> ,您可以找到导致任何错误输入的字符串。您也可以简单地将这些失败记录在 MyClass#parseLong

但是,如果您的愿望是根本不对任何不良输入进行操作,那么将整个流包围在您试图捕获的内容中(根据Naman的回答)就是我会采取的路线.

关于java - 使用流处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58201890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com