2015-09-03 3 views
11

Как я могу сделать что-то подобное в Java 8?Java 8 lambdas исполнение

boolean x = ((boolean p)->{return p;}).apply(true); 

Сейчас я получаю следующее сообщение об ошибке:

The target type of this expression must be a functional interface

+0

Примеров я могу видеть сделать не использовать {}, так как он должен быть одним выражением. [Tutorial] (http://winterbe.com/posts/2014/03/16/java-8-tutorial/) – flaschenpost

+0

То же самое без <} вокруг возврата p. Я не думаю, что это проблема. –

+2

Ваша ошибка в том, что 'Function' имеет какой-либо особый статус, чтобы тип лямбды автоматически принудительно вставлялся в него. На самом деле ваше выражение не имеет ограничений по типу. –

ответ

22

В соответствии с JLS section 15.27:

It is a compile-time error if a lambda expression occurs in a program in someplace other than an assignment context (§5.2), an invocation context (§5.3), or a casting context (§5.5).

Это также возможно использовать лямбда-выражение в return statement.

Затем мы можем переписать пример четырьмя различными способами:

  • Создавая контекст присваивания:

    Function<Boolean, Boolean> function = p -> p; 
    boolean x = function.apply(true); 
    
  • Создавая контекст вызова:

    foobar(p -> p); 
    
    private static void foobar(Function<Boolean, Boolean> function) { 
        boolean x = function.apply(true); 
    } 
    
  • Создавая контекст литья:

    boolean x = ((Function<Boolean, Boolean>) p -> p).apply(true); 
    
  • Использование return заявления:

    boolean x = function().apply(true); 
    
    private static Function<Boolean, Boolean> function() { 
        return p -> p; 
    } 
    

Кроме того, в этом простом примере, выражение весь лямбды можно переписать в виде:

UnaryOperator<Boolean> function = UnaryOperator.identity(); 
+0

Спасибо! –

Смежные вопросы