我刚开始使用JAVA 1.8版本,并且在学习有关lambda表达式的教程时遇到了一个问题。
通过在同一类中创建接口的多个实例,我们可以为抽象方法提供多个实现(lambda表达式)吗? 我尝试了代码,它运行得很好。...
现在我的问题是接口的概念是,每个实现类都将对抽象方法进行定义。那么我们如何在同一类中具有两个方法主体(lambda表达式)?
考虑以下代码:
public static void main(String[] args) {
Interf i = (a, b) -> a + b;
System.out.println("The result is >> " + i.result(10, 20));
Interf i1 = (a, b) -> a - b;
System.out.println("The result is >> " + i1.result(10, 20));
}
输出:
结果是>> 30
结果是>> -10
答案 0 :(得分:3)
实际上,它们是同一接口的两种不同实现。实际上,您可以使用现有的BinaryOperator
进行相同的操作,而不必像这样重新发明轮子。
BinaryOperator<Integer> sum = (n1, n2) -> n1 + n2;
BinaryOperator<Integer> substract = (n1, n2) -> n1 - n2;
System.out.println(sum.apply(10, 20));
System.out.println(substract.apply(10, 20));
答案 1 :(得分:2)
您的两个lambda表达式均分别实现您的Interf
功能接口。因此,该接口的每个实现都具有该接口的单个抽象方法的单个实现。
即使在Java 8和lambda表达式之前,您也可以创建两个实现Interf
接口的匿名类实例。他们每个人都有一个Interf
单一方法的单一实现。
两个lambda表达式在同一类中定义的事实并不意味着功能接口的abstract方法的两个实现都属于同一类。
答案 2 :(得分:0)
让我告诉你正确的用例。
class Person {
String firstName;
int age;
enum Gender {
MALE, FEMALE;
}
Double salary;
Gender gender;
public Person(String firstName, int age, Double salary, Gender gender) {
super();
this.firstName = firstName;
this.age = age;
this.salary = salary;
this.gender = gender;
}
void printPerson(Person p, PersonFilter pf) {
if (pf.filter(p)) {
System.out.println("First Name: "+p.firstName+" Age: "+p.age+" Salary: "+p.salary+" Gender: "+p.gender);
}
}
}
interface PersonFilter { // Functional interface
boolean filter(Person person);
}
public class LambdaExpressionTwo {
/**
* @param args
*/
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Atul", 31, 10000.0, Person.Gender.MALE));
persons.add(new Person("Mohan", 32, 17500.0, Person.Gender.MALE));
persons.add(new Person("Mic", 34, 15000.0, Person.Gender.FEMALE));
persons.add(new Person("Ricky", 30, 15000.0, Person.Gender.MALE));
/*persons.forEach(p-> { // Search Criteria Code in an Anonymous Class
p.printPerson(p, new PersonFilter() {
@Override
public boolean filter(Person person) {
return p.gender == Person.Gender.FEMALE;
}
});
});*/
persons.forEach(p-> { // Search Criteria Code with a Lambda Expression
p.printPerson(p, (Person p1) -> p1.gender == Person.Gender.MALE);
});
}
}
使用 Lambda 表达式减少编码。