IntPipelineError in a nested loop
Paul Sandoz
paul.sandoz at oracle.com
Tue Apr 9 04:28:32 PDT 2013
On Apr 9, 2013, at 12:58 PM, Jose <jgetino at telefonica.net> wrote:
>
>
> Thanks Paul,
>
> I forgot again that streams get conssumed!! :-(
>
> However there seems to be some more problems with the code, as I still get
> an error message like this:
>
> "Exception in thread "main" java.lang.IncompatibleClassChangeError:
> Class java.util.stream.IntPipeline does not implement the requested
> interface util.logger.functions.IntBiConsumer"
>
There is a bug related to static methods in interfaces that declare lambdas. Try:
public class Test {
public interface IntBiConsumer {
void accept(int n, int m);
}
static void fold(IntStream sx, Supplier<IntStream> ssy, IntBiConsumer bc) {
sx.forEach(nx -> ssy.get().forEach(ny -> bc.accept(nx, ny)));
}
public static void main(String[] args) throws Exception {
IntStream sx = Streams.intRange(0, 10);
Supplier<IntStream> ssy = () -> Streams.intRange(0, 5);
IntBiConsumer bc = (x, y) -> System.out.println("x: " + x + " y: " + y);
fold(sx, ssy, bc);
}
}
> On the other hand I tried your suggestion of using:
>
> flatMap() instead of fold()
>
> but then I get a linear stream, and I can't plug a biconsumer to the output.
>
Yes, i should have been clearer you are essentially creating your own "flat map" like thing from which you report elements to a bi-consumer. Its not really a fold since you are not providing an identity and an operator to combining pairs of elements into a result.
If you were to use flatMap you need to create an instance of a pair holding x & y. Unfortunately in Java this is painful since it lacks tuples :-(
Paul.
> The biconsumer needs to be aware of both coordinates x, and y because in
> practical cases they have different meanings.
>
>
> The new code, with flatMap included :
>
>
> import java.util.function.Supplier;
> import java.util.stream.IntStream;
> import java.util.stream.Streams;
>
>
>
> @FunctionalInterface
> public interface IntBiConsumer {
>
>
> void accept(int n, int m);
>
> static void fold(IntStream sx, Supplier<IntStream> ssy, IntBiConsumer
> bc) {
> sx.forEach(nx -> ssy.get().forEach(ny -> bc.accept(nx, ny)));
> }
>
> class Demo {
> public static void main(String[] args) {
> Supplier<IntStream> ssx = () -> Streams.intRange(0, 10);
> Supplier<IntStream> ssy = () -> Streams.intRange(0, 5);
> IntBiConsumer bc = (x, y) -> System.out.println("x: " + x + ",
> y: " + y);
> /*----------- FLAT ---------*/
> IntStream sx=ssx.get();
> IntStream flatted= sx.flatMap(n -> ssy.get());
> flatted.forEach(n -> System.out.println("n: " + n));
> /*----------- FOLD ---------*/
> sx=ssx.get();
> fold(sx, ssy, bc);
> }
> }
> }
>
>
More information about the lambda-dev
mailing list