java使用lambda交换流中的值
我尝试使用lambdas交换char[]数组中的元素。这是否意味着我正在尝试在流时更改流
如果这是一个问题,那么一个新的流就可以了。如何做到这一点?我不是在找你 比较器。我希望在不使用任何API(除了lambdas)的情况下使用这段代码
我现在在这段代码中使用lambdas进行打印
public class DutchNationalFlag {
private static final int N = 10;
private static char[] flags = new char[]{'R','B','B','R','R','B','B','R','R','B'};
public static void main( String... argv){
new String(flags).chars().mapToObj(i -> (char)i).forEach(System.out::println);
int m = 0, k = 0;
while (m != N) {
if (flags[m] == 'B') { }
else {
swap(flags,k,m);
k = k+1;
}
m = m+1;
}
new String(flags).chars().mapToObj(i -> (char)i).forEach(System.out::println);
}
private static void swap(char[] flags, int k, int m) {
char temp = flags[k];
flags[k] = flags[m];
flags[m] = temp;
}
}
可能的解决办法1:
这与原始代码不完全一样。它不交换也不前进k,k是'B'和'R'之间的边界。但是它产生了结果,我认为像zip这样的东西可能有用
Stream<Character> stream1 =
IntStream.range(0, flags.length).mapToObj(i -> (char)flags[i]);
Stream<Character> stream2 =
IntStream.range(0, flags.length).mapToObj(i -> (char)flags[i]);
Stream.concat(stream2.filter(x-> (x == 'B')), stream1.filter( y->(y == 'R') )).forEach(System.out::println);
# 1 楼答案
流式传输时更改流不会遇到任何问题,因为您使用的是字符数组。数组不是流(尽管数组可以用作流)。在遍历数组时修改它没有问题。如果您使用Java迭代器,我想您所指的问题就会出现,每当您使用
for (SomeType item : container)
循环时,都会隐式使用这些迭代器这是因为当遍历容器通常时,除了能够删除循环迭代中当前使用的单个元素外,无法安全地保证在遍历容器时可以对其进行修改。如果要进行更复杂的就地修改,则需要一种不太通用的容器类型,如数组
这与Java8StreamAPI无关,Java8StreamAPI是以一种受使用map/filter/reduce的函数编程启发的方式来处理流的。使用此API的目的是以避免并发修改面临的大多数问题的方式并发或顺序修改大量数据。您实际上没有在代码中使用任何流,也没有理由这样做,所以我认为这不是您想要的。在这里坚持一个命令
for
,因为数组的就地修改是for
循环最擅长的Lambdas和streams是非常非常强大的工具,但它们不是适合这项工作的工具。您正在使用一个简单的数组,并且希望进行就地修改。如果一张两张就可以了,千万不要打出一张a