【问题标题】:Concise Streams Syntax - Processing User Input简洁流语法 - 处理用户输入
【发布时间】:2019-10-25 12:40:25
【问题描述】:

我有一个方法,它通过扫描仪获取输入,使用 toUpperCase 格式化并在空格上拆分。 它还需要输入限制。所以只有前 N 个单词会出现在输出的数组中。

public String[] getMultiLineInput(int inputLimit) 

        String[] input = Arrays.stream(scanner.nextLine().toUpperCase().split("\\s+"))
                .limit(inputLimit)
                .toArray(size -> new String[inputLimit]);

        return input;
    }

我的方法按预期工作,但是我现在想添加一个附加条件。如果scanner.nextline() 检索到的字符串小于输入限制。然后它会进一步修剪它以避免我的 String[] 中的 NULL 条目

public String[] getMultiLineInput(int inputLimit){

        System.out.println("> ");
        String[] input = Arrays.stream(scanner.nextLine().toUpperCase().split("\\s+"))
                .limit(inputLimit)
                .toArray(size -> new String[inputLimit]);

        ArrayList<String> temp = new ArrayList<>();

        for ( String word : input){
            if ( word != null){
                temp.add(word);
            }
        }

        String [] trimmedarray = temp.toArray(new String[temp.size()]);
        return trimmedarray;

    }

有没有更简洁/有效的方式来使用流 + lamda(java 8 的新手)?有没有办法将此额外步骤包含在我的流中?。

【问题讨论】:

  • 如果scanner.nextline()检索到的String小于输入限制,是什么意思。?您在上面的代码中没有任何条件地删除 null

标签: java arrays lambda syntax java-stream


【解决方案1】:

调用数组时不要自己指定长度。改用方法引用,让您的代码更具可读性:

public String[] getMultiLineInput(int inputLimit) {
    String[] input = Arrays.stream(scanner.nextLine().toUpperCase().split("\\s+"))
            .limit(inputLimit)
            .toArray(String[]::new);
    return input;
}

或者正如@Naman 建议的那样:

public String[] getMultiLineInput(int inputLimit) {
    return Arrays.stream(scanner.nextLine().toUpperCase().split("\\s+"))
                 .limit(inputLimit)
                 .toArray(String[]::new);
}

【讨论】:

  • 为什么不直接内联变量并直接返回。
  • @Naman 感谢您指出这一点。我刚刚复制了粘贴的 OP 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2014-09-03
  • 1970-01-01
相关资源
最近更新 更多