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