Streams
August 25, 2014 6 Comments
I tried to use lambdas to swap elements in the char[] array. Does this mean that I am trying to change the stream while it is streaming ? This code is from http://www.cs.uofs.edu/~mccloske/courses/cmps144/invariants_lec.html but this question is unrelated to those concepts.
If that is a problem then a new stream will do. How should this be done ? I am not looking for a Comparator. I would like to work with this code as it is without using any API but lambdas.
I am printing using lambdas in this code now.
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;
}
}
Possible Solution 1:
This doesn’t do exactly what the original code does. It doesn’t swap and doesn’t advance k which is the boundary between ‘B’ and ‘R’.But it produces the result.
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);