假设我们有以下Java代码。
public static void main(String[] args) {
Map<Integer, Integer> map = null;
try {
map = readFromFile(); //Method that reads from file, throws IOException
}
catch (IOException e) {
//do something
}
List<Integer> list = new ArrayList<Integer>();
list.stream().map(x -> map.get(x)).collect(Collectors.toList());
}
上面的代码无法编译,因为map
不是最终的或有效的最终版本。但是,当我们用其他变量替换map
时,代码会编译。在替换之后,最后两行代码可能如下所示。
Map<Integer,Integer> mapReplacement = map;
list.stream().map(x -> mapReplacement.get(x)).collect(Collectors.toList());
我觉得有必要将相同的地图分配给另一个变量,以便能够在流中使用它。还有其他(也许是更好的)处理方法吗?如果map
变量只被分配给一次,那么它将起作用,但是为了实现这一点,必须将整段代码包装在try-block中,这看起来似乎没有办法对我来说。
答案 0 :(得分:4)
在您未显示的代码中出现问题 - 您的评论专栏:)
catch (IOException e) {
//do something
}
如果您的readFromFile()
方法 会抛出异常,您会做什么?
你会用空地图继续处理吗?因此,您的readFromFile()
应返回空地图,而不是抛出异常。 (或者你可以把方法换成另一个。)
public static void test1(String[] args) {
final Map<Integer, Integer> map = readFromFile();
final List<Integer> list = new ArrayList<>();
list.stream().map(x -> map.get(x)).collect(Collectors.toList());
}
您会停止进一步处理吗?然后只需从方法中返回即可。 (当然,你不应该只是吞下异常,而是让客户端方法知道。)
public static void test1(String[] args) {
final Map<Integer, Integer> map;
try {
map = readFromFile();
}
catch (IOException e) {
// handle the exceptional situation
return; // or throw another exception, but leave the method
}
final List<Integer> list = new ArrayList<>();
list.stream().map(x -> map.get(x)).collect(Collectors.toList());
}
增加:
如果您希望readFromFile()
方法抛出异常,请考虑将原始异常包装到您自己的异常中。当然,这取决于方法在应用程序逻辑中的位置。如果您将其视为低级方法,IOException
非常适合此目的。如果你认为它更高级,你应该创建自己的异常,反映方法的业务逻辑。
在两者中,情况不要忘记在readFromFile()
方法中正确处理输入文件的CLOSING,尤其是在异常的情况下。您可以使用Java 7 try-with-resources功能。