【问题标题】:Lambda Expression JAVA-8Lambda 表达式 JAVA-8
【发布时间】:2021-02-03 12:34:07
【问题描述】:

我刚开始使用 JAVA 1.8 版本,在阅读有关 lambda 表达式的教程时遇到了一个问题。

我们可以通过在同一个类中创建多个接口实例来为抽象方法提供超过 1 个实现(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

【问题讨论】:

    标签: lambda java-8


    【解决方案1】:

    您的两个 lambda 表达式中的每一个都分别实现了您的 Interf 功能接口。因此,该接口的每个实现都有该接口的单个​​抽象方法的单个实现。

    即使在 Java 8 和 lambda 表达式之前,您也可以创建两个匿名类实例来实现您的 Interf 接口。它们中的每一个都有Interf 的单一方法的单一实现。

    两个 lambda 表达式定义在同一个类中并不意味着函数式接口的抽象方法的两个实现属于同一个类。

    【讨论】:

      【解决方案2】:

      实际上它们是同一接口的两种不同实现。事实上,您可以使用现有的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)); 
      

      【讨论】:

        【解决方案3】:

        让我告诉你正确的用例。

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

        【讨论】:

          猜你喜欢
          • 2017-11-16
          • 2015-06-01
          • 2015-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-17
          相关资源
          最近更新 更多