gpt4 book ai didi

java - 创建一个仅供在流中使用的新变量

转载 作者:行者123 更新时间:2023-11-30 07:09:24 26 4
gpt4 key购买 nike

假设我们有以下一段 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 中,这似乎不是到我这里来。

最佳答案

问题出在您未显示的代码中 - 您的评论行:)

catch (IOException e) {
//do something
}

如果您的 readFromFile() 方法抛出异常,您将如何做?

1。继续处理

你会用空 map 继续处理吗?因此,您的 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());
}

2。停止处理

你们会停止进一步处理吗?然后简单地从该方法返回。 (当然,您不应该只是吞下异常,而应该让客户端方法以某种方式知道。)

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 非常适合您的目的。如果您认为它更高级,您应该创建自己的异常来反射(reflect)方法的业务逻辑。

两种情况下,不要忘记在您的readFromFile() 方法中正确处理输入文件的CLOSING,尤其是在异常情况下。您可以使用 Java 7 try-with-resources功能。

关于java - 创建一个仅供在流中使用的新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162738/

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