标签:javase lambda interface 函数式 面向对象
*例如有如下的操作数组的接口和类:
//处理行为接口 public interface Command { //封装处理行为的方法 void process(int[] target); }
//处理数组的类 public class ProcessArray { //方法参数为处理的数组和处理命令 public void process(int[] target,Command cmd) { cmd.process(target); } }
//打印处理实现处理接口 public class PrintCommand implements Command { public void process(int[] target) { for(int temp : target) System.out.println("迭代输出目标数组的元素:"+temp+"\t"); } }
//求和处理实现处理接口 public class AddCommand implements Command { public void process(int[] target) { int sum=0; for(int temp : target) sum+=temp; System.out.println("目标数组求和的结果为:"+sum+"\t"); } }
Java8之前使用匿名内部类的解决方法:
//使用匿名对象和 匿名内部类实现 public class CommandTest { public static void main(String[] args) { ProcessArray pa=new ProcessArray(); int[] target={5,1,0,9,-2,10}; //创建匿名对象 pa.process(target,new PrintCommand()); pa.process(target,new AddCommand()); //调用处理数组的方法,具体行为取决于匿名内部类 pa.process(target,new Command() { public void process(int[] target) { for(int temp : target) System.out.println("迭代输出目标数组的元素:"+temp+"\t"); } } ); pa.process(target,new Command() { public void process(int[] target) { int sum=0; for(int temp : target) sum+=temp; System.out.print("目标数组求和的结果为:"+sum+"\t"); } } ); } }
//利用java8的Lambda表达式 public class CommandTest2 { public static void main(String[] args) { ProcessArray pa=new ProcessArray(); int[] target={5,1,0,9,-2,10}; //处理数组,具体行为取决于内部类 pa.process(target,(int[] arr)-> { int sum=0; for(int tmp:target) sum+=tmp; System.out.println("数组元素和为"+sum); } ); } }
Lambda表达式由3部分组成:
<1>形参列表。形参列表允许省略形参类型,如果形参列表只有一个参数,形参列表的圆括号也可以省略。
<2>箭头(->)。
<3>代码块。如果代码块只有一条语句,Lambda表达式允许省略代码的花括号;Lambda代码块只有一条return语 句,可以省略return关键字。
例如如下一个完整实例演示了 Lambda表达式的简化用法:
interface Eatable { void taste(); } interface Flyable { void fly(String weather); } interface Addable { int add(int a,int b); } public class LambdaDemo { //调用该方法需要Eatable对象 public void eat(Eatable v) { System.out.println(v); v.taste(); } //调用该方法需要Flyable对象 public void fly(Flyable v) { System.out.println(v); v.fly("天气晴朗,万里无云"); } //调用该方法需要Addable对象 public void add(Addable v)· { System.out.println(v); System.out.println("5和3的和:"+v.add(5,3)); } public static void main(String[] args) { LambdaDemo ld=new LambdaDemo(); //Lambda表达式只有一条语句,可以省略花括号 ld.eat(()->System.out.println("好吃!")); //Lambda表达式的形参列表只有一个形参,可以省略圆括号 ld.fly(weather-> { System.out.println("今天的天气是"+weather); } ); //Lambda表达式只有一条语句,可以省略花括号,当需要返回值时,也可以省略return关键字 ld.add((a,b)->a+b); } }
Lambda表达式的类型,也被称为目标类型(Target Type),Lambda表达式的目标类型必须是函数式接口。 函数式接口(Functional Interface)代表只包含一个抽象方法的接口,函数式接口可以有多个类方法和默认方法。java8开始提供的注释(Annotation)中的@FunctionalInterface注解,就是用于提示编译器进行函数式接口的检查。
例如java.util.function包下的DoubleToIntFunction接口的用法如下:
import java.util.function.*; public class DoubleToIntFunctionDemo { public void DoubleToInt(double d,DoubleToIntFunction dti) { int tmp=dti.applyAsInt(d); System.out.println(d+"----->"+tmp); } public static void main(String[] args) { DoubleToIntFunctionDemo a=new DoubleToIntFunctionDemo(); a.DoubleToInt(1.20,(d)-> { return (int)d; } ); } }
这里只是利用几个简单的例子介绍了java的Lambda表达式,以后还会有持续更新,希望从事开发的朋友能够多多交流,不断进步!
标签:javase lambda interface 函数式 面向对象
原文地址:http://blog.csdn.net/sinat_26342009/article/details/45223705