1import java.lang.annotation.Target; 2import java.lang.annotation.ElementType; 3import java.util.ArrayList; 4import java.util.Arrays; 5import java.util.Iterator; 6import java.util.List; 7import java.util.function.Consumer; 8import java.util.function.Function; 9import java.util.function.IntBinaryOperator; 10import java.util.function.IntFunction; 11import java.util.function.Predicate; 12import java.util.function.Supplier; 13import java.util.function.ToIntBiFunction; 14 15@Target(ElementType.TYPE_USE) @interface A {} 16 17@Target(ElementType.TYPE_USE) @interface B {} 18 19@Target(ElementType.TYPE_USE) @interface C {} 20 21@skip-test 22class LambdaExpression { 23 //Single inferred-type parameter 24 IntFunction<Integer> f0 = (x) -> x+1; 25 26 //Parentheses optional for single inferred-type parameter 27 IntFunction<Integer> f1 = x -> x+1; 28 29 //Single declared-type parameter, expression body 30 IntFunction<Integer> f2 = (@A int x) -> x+1; 31 32 //Single declared-type parameter, block body 33 IntFunction<Integer> f3 = (@A int x) -> { return x+1; }; 34 35 //Multiple declared-type parameters 36 IntBinaryOperator f4 = (@A int x, @B int y) -> x+y; 37 38 //Generic argument type 39 static final ToIntBiFunction<String[], List<? extends CharSequence>> 40 selectCommon = (@A String @B [] array, 41 @A List<@B ? extends @C CharSequence> list) -> 42 { 43 int total = 0; 44 for (int i = 0; i < array.length; i++) { 45 Iterator<? extends CharSequence> iter = list.iterator(); 46 String str = array[i]; 47 while (iter.hasNext()) { 48 CharSequence seq = iter.next(); 49 if (seq.toString().equals(str)) { 50 ++total; 51 iter.remove(); 52 break; 53 } 54 } 55 } 56 return total; 57 }; 58 59 public static void main(String[] args) { 60 String[] ss = {"a", "b"}; 61 System.out.println(selectCommon.applyAsInt(args, Arrays.asList(ss))); 62 } 63} 64 65