有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

lambda如何使用java流只替换列表<Character>的第一个元素,而不更改列表的其余部分?

我得到一个列表,我想用“$”符号替换列表中的第一个值,这样我就可以在其他地方使用它。但我不希望列表中的其他字符被错放或更改。可以将结果作为一个新列表

我已经试着使用这个列表了。add(index,value)函数,但它会更改列表的顺序。但我不想对名单的其他部分做任何改变

有没有学习java streams的好教程。我觉得大师很困惑。提前谢谢

如果输入列表为('H'、'E'、'L'、'L'、'O'),则输出应与('$'、'E'、'L'、'L'、'O')完全相同


共 (4) 个答案

  1. # 1 楼答案

    您可以使用索引访问列表。如果索引为零,则将其发送到$,否则只将其发送到流处理管道的下一步。最后将其收集到一个列表中。如果使用Java8,这种方法比修改源容器要好。这是它的样子

    List<Character> updatedList = IntStream.range(0, chars.size())
        .mapToObj(i -> i == 0 ? '$' : chars.get(i))
        .collect(Collectors.toList());
    

    这个问题不适合使用Java8流来解决。这里的一个缺点是它是在线性时间内运行的,看起来我们使用java8过度设计了它。相反,如果您直接修改数组或列表chars[0] = '$';,那么您只能在固定时间内进行修改。此外,命令式方法更紧凑、可读性更强,并且明显减少了视觉混乱。我刚刚发布了Java8的实现方法,因为您已经明确要求这样做。但对于这个特殊的例子,命令式方式在我看来要好得多。要么使用数组并设置^ {< CD4> }第三个索引,或者如果出于某种原因需要继续执行列表,则考虑使用List.set,如上面的注释所述。p>

  2. # 2 楼答案

    类似于this,但具有外部索引

    AtomicInteger index = new AtomicInteger();
    List<Character> newCollect = list.stream()
            .map(ch -> (index.getAndIncrement() == 0) ? '$' : ch)
            .collect(toList());
    
  3. # 3 楼答案

    您好,您可以查看解决方案

    public static void replaceCharacterList(){
    
            List<String> list =new ArrayList<String>();
            list.add("H");
            list.add("E");
            list.add("L");
            list.add("L");
            list.add("O");
            List<String> newItems = list.stream()
                .map(value-> value.replace(list.get(0),"$") )
                .collect(toList());
          Log.d("replace list","list "+list+" new list "+newItems);
        }
    

    输出结果是这样的

    output: list [H, E, L, L, O] new list [$, E, L, L, O]

    另外,对于另一个示例,您也可以查看这个没有流的示例

    https://examples.javacodegeeks.com/core-java/util/collections/replace-specific-element-of-list-example/

  4. # 4 楼答案

    在索引的替换方法中,始终可以使用传统的数组复制和验证:

    public class Main {
      private static List<Character> replace(List<Character> chars,int index, char value) {
        Character[] array = characters.toArray(new Character[0]);
        array[index] = value;
        return Arrays.asList(array);
      }
      public static void main(String[] args) {
        List<Character> characters = new ArrayList<>();
        characters.add('H');
        characters.add('E');
        characters.add('L');
        characters.add('L');
        characters.add('O');
        characters = replace(characters, 0, '$');
        for (Character character : characters) {
          System.out.println(character);
        }
      }
    }