创建一个仅用于流的新变量

时间:2014-04-18 21:34:14

标签: java java-8 java-stream

假设我们有以下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中,这看起来似乎没有办法对我来说。

1 个答案:

答案 0 :(得分:4)

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

catch (IOException e) {
    //do something
}

如果您的readFromFile()方法 会抛出异常,您会做什么

1。继续处理

你会用空地图继续处理吗?因此,您的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非常适合此目的。如果你认为它更高级,你应该创建自己的异常,反映方法的业务逻辑。

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