Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅替换列表的第一个元素<;性格>;使用java流而不对列表的其余部分进行任何更改?_Java_Lambda_Java 8_Java Stream - Fatal编程技术网

如何仅替换列表的第一个元素<;性格>;使用java流而不对列表的其余部分进行任何更改?

如何仅替换列表的第一个元素<;性格>;使用java流而不对列表的其余部分进行任何更改?,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我得到一个列表,我想用“$”符号替换列表中的第一个值,这样我就可以在其他地方使用它。但我不希望列表中的其他字符被错放或更改。可以将结果作为一个新列表 我已经尝试过使用list.add(index,value)函数,但是它改变了列表的顺序。但我不想对名单的其他部分做任何改变 有没有学习java streams的好教程。我觉得大师很困惑。提前谢谢 如果输入列表为('H'、'E'、'L'、'L'、'O'),则输出应与('$'、'E'、'L'、'L'、'O')完全相同。您可以使用索引访问列表。如果索引为

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

我已经尝试过使用list.add(index,value)函数,但是它改变了列表的顺序。但我不想对名单的其他部分做任何改变

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


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

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

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

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

< P> >您可以查看它的解决方案

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);
    }
公共静态void replaceCharacterList(){
列表=新的ArrayList();
列表。添加(“H”);
列表。添加(“E”);
列表。添加(“L”);
列表。添加(“L”);
列表。添加(“O”);
List newItems=List.stream()
.map(值->值.replace(list.get(0),“$”)
.collect(toList());
日志d(“替换列表”、“列表”+列表+“新列表”+新项目”);
}
输出结果是这样的

输出:列表[H,E,L,L,O]新列表[$,E,L,L,O]

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

类似于,但具有外部索引

AtomicInteger索引=新的AtomicInteger();
List newCollect=List.stream()
.map(ch->(index.getAndIncrement()==0)?“$”:ch)
.collect(toList());

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

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);
    }
  }
}
公共类主{
私有静态列表替换(列表字符、int索引、字符值){
Character[]数组=characters.toArray(新字符[0]);
数组[索引]=值;
返回array.asList(array);
}
公共静态void main(字符串[]args){
列表字符=新的ArrayList();
字符。添加('H');
字符。添加('E');
字符。添加('L');
字符。添加('L');
字符。添加('O');
字符=替换(字符,0,“$”);
用于(字符:字符){
System.out.println(字符);
}
}
}

到目前为止,您尝试了什么?你能在这里展示一下吗?看起来您可以执行类似于
list.set(0,“$”)的操作。你是说?流在这里根本不相关。看起来像一个。此
列表从何而来,您希望如何处理转换后的列表?我从未在实际应用程序代码中遇到过
列表
…可能的重复:它完成了任务。但是如果我们不知道第一个索引中有什么字符,我们就不能使用这个方法。@tTs我已经为您给定的示例编写了这段代码。现在我已经更新了对每个类型字符都有效的问题,它位于第一位。除非列表中还有另一个
“H”