java Lambda表达式的问题

dxy2798 2016-01-24 04:03:15
学到Lambda表达式,想替换内部类,但是总报错,哪位老师帮我改下,分不多,是个心意。

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");
});
}
}
...全文
212 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxy2798 2016-01-26
  • 打赏
  • 举报
回复
谢谢您耐心的回复,有点儿明白了,再次感谢!
引用 5 楼 qq_26946497 的回复:
拉姆达表达式所返回的函数必须和预定义的Interface保持一致,就如同你无法用int类型的变量去接纳一个double类型的表达式值 你也无法用一个interface类型接纳一个错误的函数值
  • 打赏
  • 举报
回复
pers.jassor.test.TestA$$Lambda$1/791452441@1fb3ebeb
苹果的味道不错!
我正在驾驶:pers.jassor.test.TestA$$Lambda$2/303563356@816f27d
今天天气是:【碧空如洗的晴日】
直升机飞行平稳
5与3的和为:8

见下

满足此要求的情况可以使用拉姆达表达式
拉姆达表达式 和 数学运算 1+1 或 字符串运算 "我喜欢" + object具有相同的性质
对比:
1+1返回值为int
"我喜欢"+object 返回值为String
拉姆达表达式返回值为Object
只不过这个Object必须是某一个符合要求的Interface

拉姆达表达式所返回的函数必须和预定义的Interface保持一致,就如同你无法用int类型的变量去接纳一个double类型的表达式值
你也无法用一个interface类型接纳一个错误的函数值
dxy2798 2016-01-25
  • 打赏
  • 举报
回复
谢谢您的回复,不过太深了,不太懂。 我是初学,并非纠结Lambda表达式,而是书上后面很多代码都用到这个,搞不清楚就影响其他知识点的学习了。 书上有个例子,前2个接口,分别有一个抽象方法,一个无参一个有参,都可以改写为Lambda表达式形式,我就想照着实现下,所以弄了个简单的,想在一句Lambda表达式里面实现run抽象方法但是总不知道错什么地方了,书上的代码如下,您再给看看.....:

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);
	}
}
引用 2 楼 qq_26946497 的回复:
那啥,你是没有用IDE工具吗 我看好像你理解错了! 错误不在于你使用拉姆达表达式使用错,在于你这个类本身就是错的! 因为你在class上面直接implements了接口,从定义上讲,那么你必须实现这个接口定义的方法. 拉姆达表达式则是这么用的:

@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 ...
   }
}
  • 打赏
  • 举报
回复
拉姆达表达式真正的意义在于将函数视为一种对象. 比如:

@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对函数式编程语法的支持使得我们可以用一种新的思路去设计东西,而不必被"对象"的概念框死.
  • 打赏
  • 举报
回复
那啥,你是没有用IDE工具吗 我看好像你理解错了! 错误不在于你使用拉姆达表达式使用错,在于你这个类本身就是错的! 因为你在class上面直接implements了接口,从定义上讲,那么你必须实现这个接口定义的方法. 拉姆达表达式则是这么用的:

@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 ...
   }
}
scmod 2016-01-24
  • 打赏
  • 举报
回复
Test t = () -> System.out.println("!!!"); t.run(); 好像是这样

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧