62,615
社区成员
发帖
与我相关
我的任务
分享
interface Test
{
public void run();
}
public class LambdaTest2 implements Test {
/*public void run() 注释掉的没问题,但是改写就不行了
{
System.out.println("p");
}*/
public static void main(String[] args) {
new LambdaTest2().run(()->{ //就是这行报错
System.out.println("p");
});
}
}
pers.jassor.test.TestA$$Lambda$1/791452441@1fb3ebeb
苹果的味道不错!
我正在驾驶:pers.jassor.test.TestA$$Lambda$2/303563356@816f27d
今天天气是:【碧空如洗的晴日】
直升机飞行平稳
5与3的和为:8
interface Eatable
{
void taste();
}
interface Flyable
{
void fly(String weather);
}
interface Addable
{
int add(int a , int b);
}
public class LambdaQs
{
// 调用该方法需要Eatable对象
public void eat(Eatable e)
{
System.out.println(e);
e.taste();
}
// 调用该方法需要Flyable对象
public void drive(Flyable f)
{
System.out.println("我正在驾驶:" + f);
f.fly("【碧空如洗的晴日】");
}
// 调用该方法需要Addable对象
public void test(Addable add)
{
System.out.println("5与3的和为:" + add.add(5, 3));
}
public static void main(String[] args)
{
LambdaQs lq = new LambdaQs();
// Lambda表达式的代码块只有一条语句,可以省略花括号。
lq.eat(()-> System.out.println("苹果的味道不错!"));
// Lambda表达式的形参列表只有一个形参,省略圆括号
lq.drive(weather ->
{
System.out.println("今天天气是:" + weather);
System.out.println("直升机飞行平稳");
});
// Lambda表达式的代码块只有一条语句,省略花括号
// 代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字。
lq.test((a , b)->a + b);
}
}
@FunctionalInterface
interface Work{
public boolean doWork(Object worker, Object target, Date timeLimit);
}
//...
然后呢,我有一个任务托管中心,它有一个方法是进行任务托管
public Object myWorker;
public boolean proxyWork(String targetDescribe, Work work) {
Date timeLimit = DateUtil.getTime("三天以后");
return work.doWork(myWorker, getTarget(targetDescribe), timeLimit);
}
但是这个任务究竟怎么执行,它并不知道,使用的时候你需要告诉它
proxyWork(targetDescribe, (worker, target, timeLimit)->{/*balala...*/return false;});
没错,这就是一个简单的回调函数用法,比起java1.7的时代,仅仅是节省了一些代码空间而已.
那时候我们需要new Work(){doWork(worker, target, timeLimit){/*balala...*/return false;}}
分析原理的话你会觉得这真的没有任何改变(本来就没变好吧!)
不过java8对函数式编程语法的支持使得我们可以用一种新的思路去设计东西,而不必被"对象"的概念框死.
@FunctionalInterface
interface Test {
public void run(String string);
}
public class Lambda {
public static void main(String[] args) {
new Lambda().doTest();
}
public void doTest() {
Test test1 = this::run;
Test test2 = (s)->this.run(s);
Test test3 = (String s)->{this.run(s)};
}
public void run(String str) {
//do something ...
}
}