// see also the test for Issue450
// Test file for lambda syntax

interface Supplier<R> {
  R supply();
}

interface Function<T, R> {
  R apply(T t);
}

interface Consumer<T> {
  void consume(T t);
}

interface BiFunction<T, U, R> {
  R apply(T t, U u);
}

interface Noop {
  void noop();
}

public class Lambda {

  public static void consumeStr(String str) {}

  Lambda(Consumer<String> consumer) {
    consumer.consume("hello");
  }

  // No parameters; result is void
  Noop f1 = () -> {};
  // No parameters, expression body
  Supplier<Integer> f2 = () -> 42;
  // No parameters, expression body
  //    Supplier<Void> f3 = () -> null;
  // No parameters, block body with return
  Supplier<Integer> f4 =
      () -> {
        return 42;
      };
  Noop f5 =
      () -> {
        System.gc();
      }; // No parameters, void block body

  // Complex block body with returns
  Supplier<Integer> f6 =
      () -> {
        if (true) {
          return 12;
        } else {
          int result = 15;
          for (int i = 1; i < 10; i++) {
            result *= i;
          }
          // conditional expression
          Consumer<String> consumer = result > 100 ? Lambda::consumeStr : Lambda::consumeStr;
          return result;
        }
      };

  // Single declared-type parameter
  Function<Integer, Integer> f7 = (Integer x) -> x + 1;
  // Single declared-type parameter
  Function<Integer, Integer> f9 =
      (Integer x) -> {
        return (Integer) x + 1;
      };
  // Single inferred-type parameter
  Function<Integer, Integer> f10 = (x) -> x + 1;
  // Parentheses optional for single inferred-type parameter
  Function<Integer, Integer> f11 = x -> x + 1;

  // Single declared-type parameter
  Function<String, Integer> f12 = (String s) -> s.length();
  // Single declared-type parameter
  Consumer<Thread> f13 =
      (Thread t) -> {
        t.start();
      };
  // Single inferred-type parameter
  Consumer<String> f14 = s -> s.length();
  // Single inferred-type parameter
  Consumer<Thread> f15 =
      t -> {
        t.start();
      };

  // Multiple declared-type parameters
  BiFunction<Integer, Integer, Integer> f16 = (Integer x, final Integer y) -> x + y;
  // Multiple inferred-type parameters
  BiFunction<String, String, String> f18 = (x, y) -> x + y;
}
