代码之家  ›  专栏  ›  技术社区  ›  Cesar Justo

如何将列表的值修改为java流?

  •  0
  • Cesar Justo  · 技术社区  · 2 年前

    我目前正在使用Java并练习我的编程逻辑,作为一种良好的实践,我正在尝试在Java集合的一些操作中应用流。

    在这种情况下,我有一个方法,它接收一个字符串和一个集合列表,该字符串必须被带到一个列表中,以根据在集合中找到的值来替换其字符,一旦被替换,它们就会被带回到字符串中,并返回:

    private static String wordToGuess(String word,List<Integer> valueUniqueToRemplace){
        List<String> wordToList=new ArrayList<>(Arrays.asList(word.split("")));
        for (Integer integer : valueUniqueToRemplace) {
            wordToList.set(integer, "_");
        }
        return wordToList.stream().map(String::valueOf).collect(Collectors.joining(""));
    }
    

    我如何用流函数替换for循环,以及在其中做了什么?

    0 回复  |  直到 2 年前
        1
  •  3
  •   Eritrean    2 年前

    作为一个很好的实践,我尝试在Java集合的一些操作中应用流

    练习是好的,但也要注意使用某种语言结构何时有意义,何时没有意义。并不是每个任务都适合用流来解决。如果我没看错的话,您正试图用下划线替换字符串的某些索引。这还不清楚,至少乍一看你的方法是这样的。我会写下面这样的东西,更容易理解:

    private static String wordToGuess1(String word,List<Integer> valueUniqueToReplace){
        char[] chars = word.toCharArray();
        valueUniqueToReplace.forEach(i -> chars[i] = '_');
        return String.valueOf(chars);
    }
    

    private static String wordToGuess2(String word,List<Integer> valueUniqueToReplace){
        StringBuilder sb = new StringBuilder(word);
        valueUniqueToReplace.forEach(i -> sb.setCharAt(i, '_'));
        return sb.toString();
    }
    

    当然有更好的方法,但我自然而然地想到了以下流的替代方案:

    private static String wordToGuess3(String word,List<Integer> valueUniqueToReplace){
        return IntStream.range(0, word.length())
                        .map(i -> valueUniqueToReplace.contains(i) ? '_' : word.charAt(i))
                        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                        .toString();
    }
    
    private static String wordToGuess4(String word,List<Integer> valueUniqueToReplace){
        return valueUniqueToReplace.stream()
                                   .reduce(new StringBuilder(word),
                                           (sb, i) -> sb.replace(i, i + 1, "_"),
                                           (a,b) -> a)
                                   .toString();
    }
    

    自己决定什么更可读,我更喜欢非流式方法

        2
  •  2
  •   Rifat Rubayatul Islam    2 年前

    实际上你不需要一条小溪。您可以使用 forEach 像这样。

    valueUniqueToRemplace.forEach(i -> wordToList.set(i, "_"));
    

    如果你想使用流,你可以这样做

    valueUniqueToRemplace.stream.forEach(i -> wordToList.set(i, "_"));
    

    尽管这两种方法看起来相似,但在语义上存在差异。

    推荐文章