Lambda 调用容器中对象的方法;格式 类名::普通方法

东老讨 2020-03-24 05:04:08
List<Hero> heros = new ArrayList<Hero>();
Random r = new Random();
for (int i = 0; i < 4; i++) {
heros.add(new Hero("hero" + i, r.nextInt(1000), r.nextInt(100)));
}
/**重点
System.out.println("引用容器里的对象方法:");
filter(heros, hero -> hero.matched());
filter(heros, Hero::matched);//matched为Hero类中的普通方法;

问题??我是调用容器中的对象方法的,但是matched又不是静态方法,我怎么可以用 类名::普通方法;对这个语法不是很懂
重点**/

//这是我的过滤方法
public static void filter(List<Hero> heros, HeroChecker<Hero> hc) {
for (Hero hero : heros) {
if (hc.test(hero)) {
System.out.println(hero);
}
}
}


public interface HeroChecker<T> {
//中间函数
public boolean test(T t);

}
...全文
227 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Little5 2020-03-26
  • 打赏
  • 举报
回复
这种方法和C++的函数指针很类似。通过中间接口转换,实现把函数名作为形参传入函数的功能。 条件就是中间接口的具体类型要和你需要调用的对象方法的类相同。也就是代码里HeroChecker<T>这个T的类型为Hero,而且接口方法需要接收一个Hero类型的对象作为参数。

class Adder
{
	int i;
	int j;

	public Adder(int i, int j)
	{
		this.i = i;
		this.j = j;
	}

	public int add()
	{
		return i + j;
	}
}

interface AddInterface<T>
{
	public int result(T t);
}

public class ThreadState
{
	public static void main(String[] args)
	{
		Adder obj = new Adder(11, 22);
		int res = getRes(obj, Adder::add);// 33
	}

	public static int getRes(Adder add, AddInterface<Adder> ops)
	{
		return ops.result(add);
	}

}
东老讨 2020-03-25
  • 打赏
  • 举报
回复
你说的这个我知道,就是对象调用方法。我今天看了别人的代码,用类名调用普通方法可以的,不会报错。但是我不知道原理。

<*****************************************************************************>

使用Lambda表达式

filter(heros,h-> h.hp>100 && h.damage<50 );


在Lambda表达式中调用容器中的对象Hero的方法matched

filter(heros,h-> h.matched() );


matched恰好就是容器中的对象Hero的方法,那就可以进一步改写为

filter(heros, Hero::matched);


这种方式就叫做引用容器中的对象的方法
Little5 2020-03-24
  • 打赏
  • 举报
回复

	Hero hero = new Hero(null, 0, 0);
	filter(heros, hero::matched);//要用作用域调用对象方法,需要具体的对象。

62,624

社区成员

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

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