• Lambda表达式总结


    Lambda表达式


    1. 基础语法:java8中引入了一个新的操作符“->”,该操作符将lambda表达式拆分为两部分

      • 左侧:Lambda表达式的参数列表,接口中方法的参数列表

      • 右侧:Lambda表达式要执行操作,接口的方法重写的操作

    2. 函数式接口:只有一个抽象方法的接口.lambda表达式需要函数式接口的支持

      • 匿名内部类使用外部类的成员变量,成员变量必须为final

        • 语法格式一、无参数无返回值

          ()->System.out.println("hello world");
        • 语法格式二、一个参数无返回值小括号可以省略

          (a)->System.out.println("hello world");
        • 语法格式三、有返回值有两个以上的参数lambda体中有多条语句(只有一条语句{}可以省略不写

          A a1 = (a,b,c,d)->{
             System.out.println(a+b+c+d);
             System.out.println("hello world");
             return new A();
          }
        • 语法格式四、参数列表中的数据类型可以省略不写,jvm的编译器可以根据上下文推断出参数的数据类型(类型推断)

          四大核心函数是接口

    3. java8四大核心函数式接口

      Consumer<T> :消费型接口

      void accept(T t);

      Supplier<T> :供给型接口

      T get();

      Function<T,R>:函数型接口

      R apply(T t);

      Predicate<T> :断言型接口

      boolean test(T t);
    4. demo案例

      //lambda表达式
      public class Test01 {
      ​
          // 比较大小,不用lambda表达式
          @Test
          public void test() {
              Comparator<Integer> com = new Comparator<Integer>() {
                  @Override
                  public int compare(Integer arg0, Integer arg1) {
                      return Integer.compare(arg0, arg1);
                  }
              };
      ​
          }
          // 用lambda表达式
          @Test
          public void test01() {
              Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
          }
          // 比较employee对象并且 过滤通过年龄
          public static List<Employee> compareEmployeesWithAge(List<Employee> emps, Integer age) {
              List<Employee> li = new ArrayList<>();
              for (Employee e : emps) {
                  if (e.getAge() > age) {
                      li.add(e);
                  }
              }
              return li;
          }
      ​
          // 比较employee对象并且 过滤通过工资
          public static List<Employee> compareEmployeesWithSalary(List<Employee> emps, Double salary) {
              List<Employee> li = new ArrayList<>();
              for (Employee e : emps) {
                  if (e.getSalary() > salary) {
                      li.add(e);
                  }
              }
              return li;
          }
      ​
          public static List<Employee> compareEmployee(List<Employee> emps ,MyCompare<Employee> mycom){
              List<Employee> li = new ArrayList<>();
              for (Employee e : emps) {
                  if (mycom.compare(e)) {
                      li.add(e);
                  }
              }
              return li;
          }
          
          public static void main(String[] args) {
      ​
              Employee[] emps = new Employee[] {  new Employee("张三", 20, 4000.00), 
                                                  new Employee("李四", 21, 5000.00),
                                                  new Employee("王五", 22, 8000.00),
                                                  new Employee("赵六", 24, 1000.00),
                                                  new Employee("呵呵", 30, 9000.00) };
              List<Employee> list = Arrays.asList(emps);
              //不使用lambda表达式 普通的写法
              //System.out.println(compareEmployeesWithAge(list, 20));
              //System.out.println(compareEmployeesWithSalary(list, 5000.00));
              
              //不使用lambda表达式 接口实现类(或者匿名内部类)的写法(策略设计模式)
              //System.out.println(compareEmployee(list, new MyCompareImpl()));
              //System.out.println(compareEmployee(list, new MyCompareImpl1()));
              //System.out.println(compareEmployee(list, (l)->l.getAge() > 20));
              list.stream().filter(e->e.getSalary()>5000.00).limit(2).forEach(System.out::println);   
          }
      }
      //四大函数接口
      public class Test03 {
          @Test
          public void test1(){
              happy(1000,m->System.out.println("m:"+m));
          }
          
          public void happy(double money,Consumer<Double> con){
              con.accept(money);
          }
          
          
          @Test
          public void test2(){
              List<Integer> li = getNumber(10,()->(int)Math.random()*100);
              System.out.println(li);
          
          }
      
          private List<Integer> getNumber(int num,Supplier<Integer> sup) {
              List<Integer> list = new ArrayList<>();
              for(int i = 0; i < num;i ++){
                  list.add(sup.get());
              }
              return list;
          }
          
          
          @Test
          public void test3(){
              String s = strHandler("hello world",(str)->str.trim().toUpperCase());
              System.out.println(s);
          }
          
          public String strHandler(String str,Function<String,String> fun){
              return fun.apply(str);
          }
          @Test
          public void test4(){
              List<String> li = Arrays.asList("hello","world","nihao","shit","nibuhao");
              List<String> newli = filterStr(li,s->s.length()>5);
              System.out.println(newli);
          
          }
          public List<String> filterStr(List<String> list,Predicate<String> pre){
              List<String> strList = new ArrayList<>();
              for(String s : list){
                  if(pre.test(s)){
                      strList.add(s);
                  }
              }
              return strList;
          }
      }
       
      
      //方法引用
      public class Test04 {
          @Test
          public void Test1(){
              //等价于
              Consumer<String> con = (x)->System.out.println(x);
              Consumer<String> con1 = System.out::print;
      //        Consumer<String> con2 = new Consumer<String>() {
      //            @Override
      //            public void accept(String s) {
      //                System.out.println(s);
      //            }
      //        };
              //等价于
              con.accept("hello");
              con1.accept("hello");
          }
          @Test
          public void test2(){
              Employee emp = new Employee("mihao",122,121.00);
              Supplier<String> sup = emp::getName;
              Supplier<String> sup1 = ()->emp.getName();
              System.out.println(sup.get());
              System.out.println(sup1.get());
          }
          @Test
          public void comparator(){
              Comparator<Integer> com = Integer::compare;
              Comparator<Integer> com1 = (x,y)->Integer.compare(x,y);
              com.compare(1, 2);
              com1.compare(1, 2);
          }
      
          @Test
          public void test4(){
              //返回值boolean           类::实例方法
              BiPredicate<String,String> bp = String::equals;
              //满足条件第一个参数是调用者
              BiPredicate<String,String> bp1 = (x,y)->x.equals(y);
          }
          @Test
          public void test5(){
              Supplier<Employee> sup = Employee::new;
              Supplier<Employee> sup1 = ()->new Employee();
              sup.get();
          }
          @Test
          public void test6() {
              Function<Integer, String[]> fun = String[]::new;
              Function<Integer,String[]> fun1 = (x)->new String[x];
              fun.apply(10);
          }
      }
     
  • 相关阅读:
    Markdown语法
    IDEA常用快捷键及基本操作
    这一份MySQL书单,可以帮你搞定90%以上的面试题!
    你真的以为计算机网络不重要吗,这份书单帮你搞定相关面试题!
    学好程序员必知必会的数据结构,这一份书单你值得拥有!
    送你一份Redis书单,以后使用缓存的问题不用再问我啦!
    这本最适合夯实基础的经典 Java 书籍,可能80% 的 Java 程序员没有认真看过!
    荐书在精不在多,推荐一份夯实Java基础的必备书单!
    拿万元月薪必备的书单,学JAVA的程序员必看的5本书!
    8岁上海小学生B站教编程惊动苹果,库克亲送生日祝福
  • 原文地址:https://www.cnblogs.com/yangenyu/p/11657845.html
Copyright © 2020-2023  润新知