docs.oracle.com пример лямбда-выражения не будет компилироваться

#java #lambda

#java #лямбда

Вопрос:

Я использовал docs.oracle.com как мой способ изучения Java, и когда я попытался скомпилировать этот приведенный ниже пример кода, я получил 8 ошибок. Я использую java 7 u51. Похоже, что компилятор не распознает синтаксис лямбда-выражений, которому меня учит oracle. Я действительно надеюсь, что эти руководства не устарели, потому что они первые, которые я нашел, которые все ясно объясняют.

 import java.util.function.Consumer;

public class LambdaScopeTest {

    public int x = 0;

    class FirstLevel {

        public int x = 1;

        void methodInFirstLevel(int x) {

            // The following statement causes the compiler to generate
            // the error "local variables referenced from a lambda expression
            // must be final or effectively final" in statement A:
            //
            // x = 99;

            Consumer<Integer> myConsumer = (y) -> 
            {
                System.out.println("x = "   x); // Statement A
                System.out.println("y = "   y);
                System.out.println("this.x = "   this.x);
                System.out.println("LambdaScopeTest.this.x = "  
                    LambdaScopeTest.this.x);
            };

            myConsumer.accept(x);

        }
    }

    public static void main(String... args) {
        LambdaScopeTest st = new LambdaScopeTest();
        LambdaScopeTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}
  

И ошибки:

 C:java>javac LambdaScopeTest.java
LambdaScopeTest.java:19: illegal start of expression
            Consumer<Integer> myConsumer = (y) ->
                                                ^
LambdaScopeTest.java:20: illegal start of expression
            {
            ^
LambdaScopeTest.java:28: <identifier> expected
            myConsumer.accept(x);
                             ^
LambdaScopeTest.java:28: <identifier> expected
            myConsumer.accept(x);
                               ^
LambdaScopeTest.java:33: class, interface, or enum expected
    public static void main(String... args) {
                  ^
LambdaScopeTest.java:35: class, interface, or enum expected
        LambdaScopeTest.FirstLevel fl = st.new FirstLevel();
        ^
LambdaScopeTest.java:36: class, interface, or enum expected
        fl.methodInFirstLevel(23);
        ^
LambdaScopeTest.java:37: class, interface, or enum expected
    }
    ^
8 errors
  

Ответ №1:

Lambda — это Java 8. Посмотрите, что нового в Java 8 и @since в java.util.function.Потребитель.