标签: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