请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Lambda表达式---Day27

[复制链接]
查看: 78|回复: 0

1万

主题

2万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
48029
发表于 2019-12-3 08:05 | 显示全部楼层 |阅读模式
函数式编程脑筋概述
  在数学中,函数就是有输入量、输出量的一套盘算计划,也就是“拿什么工具做什么事变”。相对而言,面向工具过 分夸大“必须经过工具的形式来干事变”,而函数式脑筋则尽管疏忽面向工具的复杂语法——夸大做什么,而不是以 什么形式做。
  面向工具的脑筋: 做一件事变,找一个能打点这个事变的工具,挪用工具的方式,完成事变.
  函数式编程脑筋: 只要能获得到成果,谁去做的,怎样做的都不严重,重视的是成果,不重视进程
冗余的Runnable代码
  传统写法:当需要启动一个线程去完成使命时,凡是会经过 java.lang.Runnable 接口来界说使命内容,并利用 java.lang.Thread 类来启动该线程
  1. 1 package demosummary.lambda; 2  3 public class RunnableDemo1 { 4     public static void main(String[] args) { 5         //匿名内部类 6         Runnable task = new Runnable() { 7             @Override 8             public void run() { 9                 System.out.println("多线程使命尝试");10             }11         };12         new Thread(task).start();//启动线程13     }14 }
复制代码
  对上述代码分析:
    1.Thread 类需要 Runnable 接口作为参数,其中的笼统 run 方式是用来指定线程使命内容的焦点
    2.为了指定 run 的方式体,不能不需要 Runnable 接口的实现类
    3.为了省去界说一个 RunnableImpl 实现类的麻烦,不能不利用匿名内部类;
    4.必须覆盖重写笼统 run 方式,所以方式称号、方式参数、方式返回值不能不再写一遍,且不能写错;
    5.而现实上,似乎只要方式体才是关键地点
lambda更优的写法
  1. 1 package demosummary.lambda; 2  3 /** 4  * Lambda写法 5  */ 6 public class LambdaDemo1 { 7     public static void main(String[] args) { 8         new Thread(() -> System.out.println("多线程使命尝试")).start();//启动线程 9     }10 }
复制代码
  以上代码和上一个代码是一样的尝试成果,lambda写法需要在1.8以上的编译才华经过
回首匿名内部类
  1.利用实现类
    要启动一个线程,需要建立一个 Thread 类的工具并挪用 start 方式。而为了指定线程尝试的内容,需要挪用 Thread 类的机关方式:public Thread(Runnable target)
      为了获得 Runnable 接口的实现工具,可以为该接口界说一个实现类 RunnableImpl :
  1. 1 package demosummary.lambda;2 3 public class RunnableImpl implements Runnable{4     @Override5     public void run() {6         System.out.println("多线程使命尝试");7     }8 }
复制代码
    然后建立该实现类的工具作为 Thread 类的机关参数:
  1. 1 package demosummary.lambda; 2  3 public class RunnableImplTest { 4     public static void main(String[] args) { 5         //建立RunnableImpl工具 6         RunnableImpl ri = new RunnableImpl(); 7         //启动线程 8         new Thread(ri).start(); 9     }10 }
复制代码
  2.利用匿名内部类
    这个 RunnableImpl 类只是为了实现 Runnable 接口而存在的,而且仅被利用了唯逐一次,所以利用匿名内部类的 语法即可省去该类的零丁界说,即匿名内部类:
  1. 1 package demosummary.lambda; 2  3 /** 4  * 利用匿名内部类 5  */ 6 public class RunnableImplInit { 7     public static void main(String[] args) { 8         new Thread(new Runnable() { 9             @Override10             public void run() {11                 System.out.println("多线程使命尝试");12             }13         }).start();14     }15 }
复制代码
  对上述匿名内部类方式分析
    细致分析该代码中的语义, Runnable 接口只要一个 run 方式的界说:public abstract void run();
    无参数:不需要任何条件即可尝试该计划。
    无返回值:该计划不发生任何成果。
    代码块(方式体):该计划的具体尝试步伐
  而利用lambda语法要加倍简单:
    () ‐> System.out.println("多线程使命尝试!")
      前面的一对小括号即 run 方式的参数(无),代表不需要任何条件;
      中心的一个箭头代表将前面的参数传递给后背的代码;
      后背的输出语句即营业逻辑代码。
  匿名内部类的好处与弊端
    一方面,匿名内部类可以帮我们省去实现类的界说;另一方面,匿名内部类的语法——确切太复杂了
Lambda表达式的标准格式
  Lambda省去面向工具的条条框框,格式由3个部分组成:
    1.一些参数 2.一个箭头 3.一段代码
  Lambda表达式的标准格式为:(参数典范 参数称号) ‐> { 代码语句 }
  格式分析:
    1.小括号内的语法与传统方式参数列表同等:无参数则留空;
    2.多个参数则用逗号分隔。 -> 是新引入的语法格式,代表指向行动。
    3.大括号内的语法与传统方式体要求底子同等。
Lambda省略格式
  省略法则:
    1. 小括号内参数的典范可以省略;
    2. 假如小括号内有且唯一一个参,则小括号可以省略;
    3. 假如大括号内有且唯一一个语句,则不管能否有返回值,都可以省略大括号、return关键字及语句分号
Lambda的利用条件
  Lambda的语法很是简洁,完全没有面向工具复杂的约束。可是利用时有几个题目需要出格留意
    1. 利用Lambda必须具有接口,且要求接口中有且唯一一个笼统方式。 不管是JDK内置的 Runnable 、 Comparator 接口还是自界说的接口,只要当接口中的笼统方式存在且唯一 时,才可以利用Lambda。
    2. 利用Lambda必须具有高低文揣度。 也就是方式的参数或部分变量典范必须为Lambda对应的接口典范,才华利用Lambda作为该接口的实例。
    备注:有且唯一一个笼统方式的接口,称为“函数式接口”。
利用lambda标准格式(无参无返回)
  给定一个厨子 Cook 接口,内含唯一的笼统方式 makeFood ,且无参数、无返回值。以下:
  1. 1 package demosummary.lambda;2 3 /**4  * 给定一个厨子 Cook 接口,内含唯一的笼统方式 makeFood ,且无参数、无返回值。以下:5  */6 public interface Cook {7     void makeFood();8 }
复制代码
  鄙人面的代码中,请利用Lambda的标准格式挪用 invokeCook 方式,打印输出“吃饭啦!”字样:
  1. 1 package demosummary.lambda; 2  3 /** 4  * 鄙人面的代码中,请利用Lambda的标准格式挪用 invokeCook 方式,打印输出“吃饭啦!”字样: 5  */ 6 public class InvokeCook { 7     public static void main(String[] args) { 8 //        invokeCook(() -> { 9 //            System.out.println("吃饭了");10 //        });11         12         //省略格式13         invokeCook(() -> System.out.println("吃饭了"));14     }15 16     private static void invokeCook(Cook cook) {17         cook.makeFood();18     }19 }
复制代码
  备注:小括号代表 Cook 接口 makeFood 笼统方式的参数为空,大括号代表 makeFood 的方式体。
利用Lambda标准格式(有参有返回)
  给定一个盘算器 Calculator 接口,内含笼统方式 calc 可以将两个int数字相加获得和值:
  1. 1 package demosummary.lambda;2 3 public interface Calculator {4     int cal(int a, int b);5 }
复制代码
  鄙人面的代码中,请利用Lambda的标准格式挪用 invokeCalc 方式,完成120和130的相加盘算:
  1. 1 package demosummary.lambda; 2  3 public class invokeCal { 4     public static void main(String[] args) { 5 //        invokeCal(120,130,(int a , int b) -> { 6 //            return a + b; 7 //        }); 8  9         //省略格式10         invokeCal(120,130,(int a , int b) -> a + b);11     }12 13     public static void invokeCal(int a , int b , Calculator calculator){14         int result = calculator.cal(a, b);15         System.out.println("输出成果:"+result);16     }17 }
复制代码
Lambda的参数和返回值
  需求:     1.利用数组存储多个Person工具     2.对数组中的Person工具利用Arrays的sort方式经过年龄举行升序排序
  1. 1 package demosummary.lambda; 2  3 public class Person { 4     private String name; 5     private int age; 6  7     public Person() { 8     } 9 10     public Person(String name, int age) {11         this.name = name;12         this.age = age;13     }14 15     public String getName() {16         return name;17     }18 19     public void setName(String name) {20         this.name = name;21     }22 23     public int getAge() {24         return age;25     }26 27     public void setAge(int age) {28         this.age = age;29     }30 31     @Override32     public String toString() {33         return "Person{" +34                 "name='" + name + '\'' +35                 ", age=" + age +36                 '}';37     }38 }
复制代码
  1. 1 package demosummary.lambda; 2  3 import java.util.Arrays; 4  5 public class LambdaComparator { 6     public static void main(String[] args) { 7         Person[] array = { 8                 new Person("古力娜扎",22), 9                 new Person("迪丽热巴",21),10                 new Person("欧阳娜娜",19)11         };12 13 //        Arrays.sort(array,(Person a, Person b)->{14 //            return a.getAge() - b.getAge();15 //        });16 17         //省略格式18         Arrays.sort(array,(Person a, Person b) -> a.getAge() - b.getAge());19 20         for (Person person : array) {21             System.out.println(person);22         }23     }24 }
复制代码



免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表