Anonymous class replaced with lambda expressions

anonymous-class, java, java-8, lambda

Solution

You have to explicitly cast the first lambda expression to IntUnaryOperator. The following code works:

System.out.println(
        Arrays.toString(
                IntStream.rangeClosed(1, 20).skip(9).limit(10)
                        .map(((IntUnaryOperator) v -> v - 1).andThen(i -> i * 2)).toArray()));

Problem

I have sample code which uses Java 8 new stream functionality (get a range of int values 1 .. 20, skip the first 9, then take remaining 10, each int value: reduce by one and multiply by 2). ``` System.out.println(Arrays.toString( IntStream.rangeClosed(1, 20).skip(9).limit(10).map((new IntUnaryOperator() { @Override public int applyAsInt(int operand) { return operand - 1; } }).andThen(new IntUnaryOperator() { @Override public int applyAsInt(int operand) { return operand * 2; } })).toArray())); ``` The output is as follows: ``` [18, 20, 22, 24, 26, 28, 30, 32, 34, 36] ``` Now I want to replace anonymous classes with Lambda expressions. The following conversion works fine (the second anonymous class replaced with `i -> i * 2` lambda expression) and I get the same output: ``` System.out.println(Arrays.toString( IntStream.rangeClosed(1, 20).skip(9).limit(10).map((new IntUnaryOperator() { @Override public int applyAsInt(int operand) { return operand - 1; } }).andThen(i -> i * 2)).toArray())); ``` However, when I replace the first anonymous class with lambda expression: ``` System.out.println( Arrays.toString( IntStream.rangeClosed(1, 20).skip(9).limit(10) .map((v -> v - 1).andThen(i -> i * 2)).toArray())); ``` I am not able to compile my code. The error says `Operator '-' cannot be applied to '<lambda parameter>', 'int'` Do you know how to combine two lambda expressions with `IntUnaryOperator.andThen`? I know I could use ... `.limit(10).map(v -> v - 1).map(i -> i * 2).toArray() ...` which works fine but I would like to find out how to use `IntUnaryOperator.andThen` with lambdas (if that possible).

Original source