Lambda表达式
Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据
最简单的形式中,一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示:
Arrays.asList( 1, 2, 3 ).forEach( e -> System.out.println( e ) );
Lambda可以引用类的成员变量与局部变量(如果这些变量不是final的话,它们会被隐含的转为final,这样效率更高):
String str = ","; //等价于:final String str = ","; Arrays.asList( "a", "b", "c" ).forEach( ( String e ) -> System.out.print( e + str ) );
Lambda可能会返回一个值。返回值的类型也是由编译器推测出来的。如果lambda的函数体只有一行的话,那么没有必要显式使用return语句:
List<Integer> list = Arrays.asList( 4, 2, 1,3); list.sort( ( e1, e2 ) -> e1.compareTo( e2 ) ); list.forEach(e->System.out.println(e));
函数式接口
- 如何使现有的函数友好地支持lambda,java8采取了增加函数式接口的概念。
- 函数式接口就是一个只有一个方法的普通接口,可以隐式的转换成lambda表达式,除了特殊方法:默认方法,静态方法以及继承自Object类的一些方法(toString(),equels()等)
在使用中,函数式接口容易出错,如果接口中被定义了另一个方法,那么接口将不再是函数式接口,导致编译失败。为此Java8新增注解@FunctionalInterface。注意default默认方法和静态方法不会影响函数式接口。
@FunctionalInterface public interface Runnable { public abstract void run(); }
java8新增默认方法和静态方法扩展接口的声明。
public interface Convert { //可以包含静态方法 public static void hasStaticMethod(){ System.out.println("包含静态方法"); } default void hasDefaultMethod(){ System.out.println("包含默认方法"); } }
函数式接口示例
@FunctionalInterface public interface Convert<F,T> { T convert(F from); //可以包含静态方法 public static void hasStaticMethod(){ System.out.println("包含静态方法"); } default void hasDefaultMethod(){ System.out.println("包含默认方法"); } } public class ConvertMain { public static void main(String[] args) { Convert<String, Integer> converter = (from) -> Integer.valueOf(from); Integer converted = converter.convert("123"); System.out.println(converted); converter.hasDefaultMethod(); Convert.hasStaticMethod(); // Function<T, R> -T作为输入,返回的R作为输出 Function<String,String> function = (x) -> {System.out.print(x+": ");return "Function";}; System.out.println(function.apply("hello world")); //Predicate<T> -T作为输入,返回的boolean值作为输出 Predicate<String> pre = (x) ->{System.out.print(x);return false;}; System.out.println(": "+pre.test("hello World")); //Consumer<T> - T作为输入,执行某种动作但没有返回值 Consumer<String> con = (x) -> {System.out.println(x);}; con.accept("hello world"); //Supplier<T> - 没有任何输入,返回T Supplier<String> supp = () -> {return "Supplier";}; System.out.println(supp.get()); //BinaryOperator<T> -两个T作为输入,返回一个T作为输出,对于“reduce”操作很有用 BinaryOperator<String> bina = (x,y) ->{System.out.print(x+" "+y);return "BinaryOperator";}; System.out.println(" "+bina.apply("hello ","world")); }
}