【问题标题】:Any advice how to improve my implementation?任何建议如何改进我的实施?
【发布时间】:2019-04-26 09:48:22
【问题描述】:

这是我下面代码的一部分。当我使用 for 循环(注释掉)时,它可以工作。当我使用这个流时 - 它有点工作,但在我从未预料到的方法上表现不佳。

        Spravochnik spr = new Spravochnik();
        ResultSetMetaData rsmeta = rs.getMetaData();
        List<String> columnNames = new ArrayList<>();
        List<List<String>> valuesInRows = new ArrayList<List<String>>();
        int columnCount = rsmeta.getColumnCount();

        IntStream.range(0, rsmeta.getColumnCount()).forEach(i -> {
            try {
                columnNames.add(rsmeta.getColumnName(i));
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });

//      for(int column = 1; column <= columnCount; column++){
//          columnNames.add(rsmeta.getColumnName(column));
//      }

猜我只是我的实现有误。有什么建议可以在这里改进吗?谢谢!

【问题讨论】:

  • 显然,在流中,您从 0 开始,而在 for 循环中,您从 1 开始。在 ResultSet 中,列从 1 开始索引。
  • IntStream.rangeClosed(1, rsmeta.getColumnCount())

标签: java spring java-stream


【解决方案1】:

您必须小心循环或流中包含哪些数字,哪些数字不包含在内。

请注意,第一个数字始终包含在内,并且由于您从 1 循环,因此您也希望从 1 开始 Stream

IntStream.range(1, rsmeta.getColumnCount()).forEach(i -> {
    // ...
});

最后,这里使用Stream 的好处是相当值得怀疑的。实际上,根本没有没有好处。我强烈建议在这个用例中坚持使用for-loop

for (int column = 1; column <= columnCount; column++) {
    columnNames.add(rsmeta.getColumnName(column));
}

【讨论】:

  • 是否可以像这样即时创建 columnNames 列表,而不仅仅是填充?有没有可能改进?
  • 最好是....map(i -&gt; rsmeta.getColumnName(i)).collect(Collectors.toList());。但是,我不确定我现在是否得到您的问题。
  • List&lt;String&gt; columnNames = IntStream.rangeClosed(1, rsmeta.getColumnCount()).map(i -&gt; rsmeta.getColumnName(i)).collect(Collectors.toList()); 说类型不匹配不能从字符串到 int...我需要使用 getColumnName 中的索引...对不起,如果这是一个愚蠢的问题,我刚刚开始学习流
【解决方案2】:

您可以使用IntStream.range(1, rsmeta.getColumnCount()+1),它会为您提供从 1 到总数的列号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多