【问题标题】:Can i accomplish this using streams Java 8? [closed]我可以使用流 Java 8 完成此操作吗? [关闭]
【发布时间】:2020-10-29 14:53:54
【问题描述】:

我可以使用流来制作同样的代码块吗?这样是不是更有效率? 这是我的代码:

 public class Indexer {

    public static List<Integer> getIndexes(String word, char letter) {
        List<Integer> wordIndexes = new ArrayList<>();

        if (word.indexOf(letter) >= 0) {
            for (int i = 0; i < word.length(); i++) {
                if (word.charAt(i) == letter) {
                    wordIndexes.add(i);
                }
            }
        }

        return wordIndexes;
    }

}

【问题讨论】:

    标签: java stream


    【解决方案1】:

    使用 IntStream 可以实现:

    List<Integer> result = IntStream.range(0, word.length())
                                    .filter(i -> String.valueOf(word.charAt(i)).equals(letter))
                                    .boxed()
                                    .collect(Collectors.toList());
    

    正如@Locke 提到的,这里正在处理字符串,charchar 处理,将相等检查的两个操作数转换为char 更合适。这可以通过将字母定义为char letter = '?'; 来实现,然后过滤子句将是这样的:

    .filter(i -> word.charAt(i) == letter)
    

    【讨论】:

    • 这可以通过将letter 设置为char 并改用.filter(i -&gt; word.charAt(i) == letter) 来进一步改进。
    【解决方案2】:

    至于第二个问题(“这样效率更高吗?”),我还想指出,即使流可能更具可读性,但普通的 for 循环很可能具有最佳性能.

    List<Integer> wordIndexes = new ArrayList<>();
    String word = "ajborefbla";
    char letter = 'b';
    
    for (int i = 0; i < word.length(); i++) {
        if (word.charAt(i) == letter) {
            wordIndexes.add(i);
        }
    }
    

    【讨论】:

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