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);
}
uj5u.com熱心網友回復:
Hero hero = new Hero(null, 0, 0);
filter(heros, hero::matched);//要用作用域呼叫物件方法,需要具體的物件。
uj5u.com熱心網友回復:
你說的這個我知道,就是物件呼叫方法。我今天看了別人的代碼,用類名呼叫普通方法可以的,不會報錯。但是我不知道原理。<*****************************************************************************>
使用Lambda運算式
filter(heros,h-> h.hp>100 && h.damage<50 );
在Lambda運算式中呼叫容器中的物件Hero的方法matched
filter(heros,h-> h.matched() );
matched恰好就是容器中的物件Hero的方法,那就可以進一步改寫為
filter(heros, Hero::matched);
這種方式就叫做參考容器中的物件的方法
uj5u.com熱心網友回復:
這種方法和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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/107299.html
標籤:Java SE
上一篇:求助大佬們,購買的Java從入門到精通教材,隨書附贈的JAVA開發資源庫打開顯示這個,這是怎么弄啊?我是win10的系統
下一篇:求高手com.microsoft.sqlserver.jdbc.SQLServerException: ',' 附近有語法錯誤。 Query: update t
