Lambda Expression JAVA-8

时间:2018-11-15 06:30:43

标签: lambda java-8

我刚开始使用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

3 个答案:

答案 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 表达式减少编码。