我尝试使用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 ,这是'' 和'之间的界限。 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);
答案 0 :(得分:1)
您在流式传输时更改流时没有遇到任何问题,因为您正在使用一组字符。数组不是流(尽管数组可以用作流)。在遍历数组时修改数组没有问题。如果您使用的是Java 迭代器,那么在您使用for (SomeType item : container)
循环时隐式使用Java 迭代器会出现我认为您所指的问题。
这是因为当遍历容器一般时,没有办法安全地保证你可以在遍历它时修改它,除了能够移除你所使用的单个元素。目前正在循环迭代中使用。如果要进行更复杂的就地修改,则需要一种不太通用的容器类型,如数组。
这与Java 8 Stream API无关,它用于以使用map / filter / reduce的函数式编程为灵感来处理流。使用此API的目的是以避免并发修改所面临的大多数问题的方式同时或按顺序修改大量数据。您实际上并没有在您的代码中使用任何流,而且没有理由,所以我不认为这是您想要的。在这里坚持命令for
,因为数组的就地修改是for
循环最擅长的。
public static void main (String... args) {
for (Char char : chars) {
System.out.println(char);
}
int k = 0;
for (int m = 0; m != M; m++) {
if (flags[m] != 'B') {
swap(flags, k++, m);
}
}
for (Char char : chars) {
System.out.println(char);
}
}
Lambda和溪流是非常非常强大的工具,但它们并不适合这项工作。您正在处理一个简单的数组,并且您希望进行就地修改。如果两个人都这样做,就不要打ace。