Java 使用lambda删除对象

Java 使用lambda删除对象,java,lambda,java-8,Java,Lambda,Java 8,我逐渐了解了lambda语法,并得出了一些让我兴奋的结论: private ArrayList<Person> list = new ArrayList<>(); public void remove(Person person){ this.list.remove(person); } public void run(){ list.stream().filter(p -> p.getAge() > 15).forEach(p ->

我逐渐了解了lambda语法,并得出了一些让我兴奋的结论:

private ArrayList<Person> list = new ArrayList<>();

public void remove(Person person){
    this.list.remove(person);
}

public void run(){

    list.stream().filter(p -> p.getAge() > 15).forEach(p -> p.setAge(p.getAge() + 1));

    list.stream().filter(p -> p.getAge() > 15).forEach(PersonDatabase::remove);; //Syntax error

}
private ArrayList list=new ArrayList();
公共无效删除(人){
本.清单.删除(人);
}
公开募捐{
list.stream().filter(p->p.getAge()>15).forEach(p->p.setAge(p.getAge()+1));
list.stream().filter(p->p.getAge()>15).forEach(PersonDatabase::remove);//语法错误
}
当我尝试使用最后一行代码删除对象时,我得到一个错误,表示该方法不是静态的。为什么我不能引用我已经在其中的类,但是当我使用
Person::getName
时,它也不是静态的,可以正常工作

为什么我不能参考我已经在上的课

如果
remove
是非静态的,那么它需要一个接收器(调用方法的对象)

如果此代码位于
PersonDatabase
中,则应使用以下语法:
this::remove

但是当我使用
Person::getName
时,它也不是静态的,它可以正常工作吗

这是因为
p->p.getName()
相当于
Person::getName
。参数
p
被自动选择为调用
Person::getName
的接收者

换句话说,这两种变体

/* Static Person method */ static void method(Person p) { ... }
/* Non-static Person method */ void method() { ... }
这个变种呢

/* Static Person method */ static void method(Person p) { ... }
/* Non-static Person method */ void method() { ... }

在迭代
Person
对象时,可以用作
Person::method
。在前一种情况下,
p
将作为参数传递,在后一种情况下,
p
将用作接收器。

PersonDatabase::remove
有两个参数—一个隐式参数—当前
PersonDatabase
实例,另一个显式参数—传递的
Person
实例


因此,如果只有一个
Person
实例可用,则不能使用此方法引用。当您将remove方法更改为静态时,您消除了隐式的
PersonDatabase
参数,只剩下一个
Person
参数,这会使您的方法与
forEach

list.removeIf(p->p.getAge()>15)所期望的参数相匹配?@AlexisC,这不会导致调用
PersonDatabase.remove
。@aioobe我知道这不是问题的重点,而是
PersonDatabase.remove
只调用列表上的
remove
。我只是想指出,目前这种方法是无用的,你可以直接过滤列表(否则,为什么你会先将所有人的年龄设置为15岁以上,然后将其删除?即使可以使用
removeIf
,这根本不是问题所在。问题是为什么静态和非静态方法会以这种方式工作。这就是为什么我发布了一条评论而不是答案。。。。