当前位置: 首页 > news >正文

上海网站建设 找思创网络互联网十大企业

上海网站建设 找思创网络,互联网十大企业,建设信用卡分期购物网站,如何申请公众号1. 初识lambda表达式 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式#xff08;Lambda exp…1. 初识lambda表达式 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式Lambda expression基于数学中的λ演算得名也可称为闭包Closure 。 1.1 Lambda表达式的语法 基本语法: (parameters) - expression 或 (parameters) -{ statements; } 如上所示Lambda表达式由三部分组成 1. paramaters类似方法中的形参列表这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明 也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。 2. -可理解为“被用于”的意思 3. 方法体可以是表达式也可以代码块是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回这里的代码块块等同于方法的方法体。如果是表达式也可以返回一个值或者什么都不反回。 简单的举例代码如下图 // 1. 不需要参数,返回值为 2 () - 2// 2. 接收一个参数(数字类型),返回其2倍的值 x - 2 * x// 3. 接受2个参数(数字),并返回他们的和 (x, y) - x y// 4. 接收2个int型整数,返回他们的乘积 (int x, int y) - x * y// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) (String s) - System.out.print(s)1.2 函数式接口 要了解Lambda表达式,首先需要了解什么是函数式接口函数式接口定义一个接口有且只有一个抽象方法 注意 1、如果一个接口只有一个抽象方法那么该接口就是一个函数式接口 2、如果我们在某个接口上声明了 FunctionalInterface 注解那么编译器就会按照函数式接口的定义来要求该接口这样如果有两个抽象方法程序编译就会报错的。所以从某种意义上来说只要你保证你的接口中只有一个抽象方法你可以不加这个注解。加上FunctionalInterface 注解就会自动进行检测的。 函数式接口定义方式代码如下 FunctionalInterface //注解主要是jvm来检查我们的接口是不是函数式接口 interface NoParameterNoReturn {//注意只能有一个方法void test(); }也可以定义为下面代码所示部分 FunctionalInterface interface NoParameterNoReturn {void test();default void test2() {System.out.println(JDK1.8新特性default默认方法可以有具体的实现);} }2 Lambda表达式的基本使用 首先我们实现准备好几个接口代码如下 //无返回值无参数 FunctionalInterface interface NoParameterNoReturn {void test(); } //无返回值一个参数 FunctionalInterface interface OneParameterNoReturn {void test(int a); } //无返回值多个参数 FunctionalInterface interface MoreParameterNoReturn {void test(int a,int b); } //有返回值无参数 FunctionalInterface interface NoParameterReturn {int test(); } //有返回值一个参数 FunctionalInterface interface OneParameterReturn {int test(int a); } //有返回值多参数 FunctionalInterface interface MoreParameterReturn {int test(int a,int b); }Lambda也可以理解为Lambda就是匿名内部类的简化即实际上是创建了一个类实现了接口重写了接口的方法 。 没有使用lambda表达式的时候的调用方式匿名内部类的方法 NoParameterNoReturn noParameterNoReturn new NoParameterNoReturn(){ Override public void test() {System.out.println(hello);} }; noParameterNoReturn.test();具体使用lambda表达式的语句见以下示例代码 public class TestDemo {public static void main(String[] args) {NoParameterNoReturn noParameterNoReturn ()-{System.out.println(无参数无返回值);};noParameterNoReturn.test();OneParameterNoReturn oneParameterNoReturn (int a)-{System.out.println(一个参数无返回值 a);};oneParameterNoReturn.test(10);MoreParameterNoReturn moreParameterNoReturn (int a,int b)-{System.out.println(多个参数无返回值a b);};moreParameterNoReturn.test(20,30);NoParameterReturn noParameterReturn ()-{System.out.println(有返回值无参数);return 40;}; //接收函数的返回值int ret noParameterReturn.test();System.out.println(ret);OneParameterReturn oneParameterReturn (int a)-{System.out.println(有返回值有一个参数);return a;};ret oneParameterReturn.test(50);System.out.println(ret);MoreParameterReturn moreParameterReturn (int a,int b)-{System.out.println(有返回值多个参数);return ab;};ret moreParameterReturn.test(60,70);System.out.println(ret);} } 2.1 lambda表达式的语法精简 1. 参数类型可以省略如果需要省略每个参数的类型都要省略。 2. 参数的小括号里面只有一个参数那么小括号可以省略 3. 如果方法体当中只有一句代码那么大括号可以省略 4. 如果方法体中只有一条语句且是return语句那么大括号可以省略且去掉return关键字。 以上代码精简之后如下所示 public static void main(String[] args) {MoreParameterNoReturn moreParameterNoReturn ( a, b)-{System.out.println(无返回值多个参数省略参数类型a b);};moreParameterNoReturn.test(20,30);OneParameterNoReturn oneParameterNoReturn a -{System.out.println(无参数一个返回值,小括号可以胜率 a);};oneParameterNoReturn.test(10);NoParameterNoReturn noParameterNoReturn ()-System.out.println(无参数无返回值方法体中只有一行代码);noParameterNoReturn.test(); //方法体中只有一条语句且是return语句NoParameterReturn noParameterReturn ()- 40;int ret noParameterReturn.test();System.out.println(ret);}3 变量捕获   Lambda 表达式中存在变量捕获 了解了变量捕获之后我们才能更好的理解Lambda 表达式的作用域 。Java当中的匿名类中会存在变量捕获。 3.1 匿名内部类 匿名内部类就是没有名字的内部类 。我们这里只是为了说明变量捕获所以匿名内部类只要会使用就好那么下面我们来简单的看看匿名内部类的使用就好了。          代码如下图所示 class Test {public void func(){System.out.println(func());} } public class TestDemo {public static void main(String[] args) {new Test(){Overridepublic void func() {System.out.println(我是内部类且重写了func这个方法);}};} }在上述代码当中的main函数当中就是一个匿名内部类的简单的使用。  2.2 匿名内部类的变量捕获 class Test1 {public void func(){System.out.println(func());} } public class TestDemo {public static void main(String[] args) {final int a 100;Test1 t new Test1(){Overridepublic void func() {System.out.println(我是内部类且重写了func这个方法);System.out.println(我是捕获到变量 a a 我是一个常量或者是一个没有改变过值的变量);}};t.func();} }结果如下  在上述代码当中的变量a就是捕获的变量。这个变量要么是被final修饰如果不是被final修饰的 你要保证在使用 之前没有修改。如下代码就是错误的代码 class Test1 {public void func(){System.out.println(func());} } public class TestDemo {public static void main(String[] args) {int a 100;new Test1(){Overridepublic void func() {a 99;System.out.println(我是内部类且重写了func这个方法);System.out.println(我是捕获到变量 a a 我是一个常量或者是一个没有改变过值的变量);}};} }错误信息 修改为如下代码 class Test1 {public void func(){System.out.println(func());} } public class TestDemo {public static void main(String[] args) {final int a 100;Test1 t new Test1(){Overridepublic void func() {final int a 99;System.out.println(我是内部类且重写了func这个方法);System.out.println(我是捕获到变量 a a 我是一个常量或者是一个没有改变过值的变量);}};t.func();} }结果如下  2.3 Lambda的变量捕获 在Lambda当中也可以进行变量的捕获具体我们看一下代码。 FunctionalInterface interface NoParameterNoReturn {void test(); }public static void main(String[] args) {int a 10;NoParameterNoReturn noParameterNoReturn ()-{ // a 99; errorSystem.out.println(捕获变量a);};noParameterNoReturn.test();}3、Lambda在集合当中的使用 为了能够让Lambda和Java的集合类集更好的一起使用在集合当中也新增了部分接口以便与Lambda表达式对接具体如下图所示 注意Collection的forEach()方 法是从接口 java.lang.Iterable 拿过来的。  3.1 Collection接口 forEach() 方法演示该方法在接口 Iterable 当中代码如下 default void forEach(Consumer? super T action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}该方法表示对容器中的每个元素执行action指定的动作 。 package demo4;import java.util.ArrayList; import java.util.function.Consumer;public class Collection {public static void main(String[] args) {ArrayListString list new ArrayList();list.add(委婉待续);list.add(love);list.add(石老师);list.add(forever);list.forEach(new ConsumerString() {Overridepublic void accept(String str) {//简单遍历集合中的元素。System.out.print(str );}});}}输出结果 修改为lambda表达式其中代码如下 package demo4;import java.util.ArrayList; import java.util.function.Consumer;public class Collection {public static void main(String[] args) {ArrayListString list new ArrayList();list.add(委婉待续);list.add(love);list.add(石老师);list.add(forever);list.forEach((String str)- {//简单遍历集合中的元素。System.out.print(str );});System.out.println();list.forEach(( str)- {//简单遍历集合中的元素。System.out.print(str );});System.out.println();list.forEach( str- System.out.print(str ));}}测试结果如下  3.2 List接口 sort()方法的演示下面代码为sort方法源码该方法根据c语言制定的比较规则对容器元素进行排序。 package demo4;import java.util.ArrayList; import java.util.Comparator; import java.util.function.Consumer;public class Collection {public static void main(String[] args) {ArrayListString list new ArrayList();list.add(委婉待续);list.add(love);list.add(石老师);list.add(forever);list.forEach((String str) - {//简单遍历集合中的元素。System.out.print(str );});System.out.println();list.sort(new ComparatorString() {Overridepublic int compare(String str1, String str2) { //注意这里比较长度return str1.length() - str2.length();}});System.out.println(list);}}输出结果如下图所示 将上述代码修改为lambda表达式 package demo4;import java.util.ArrayList; import java.util.Comparator; import java.util.function.Consumer;public class Collection {public static void main(String[] args) {ArrayListString list new ArrayList();list.add(委婉待续);list.add(love);list.add(石老师);list.add(forever);list.forEach((String str) - {//简单遍历集合中的元素。System.out.print(str );});System.out.println();list.sort((String str1, String str2)- str1.length() - str2.length() );//注意这里比较长度//返回的是长度的差值System.out.println(list);}}结果如下 3.3 Map接口 HashMap 的 forEach(该方法原码如下 default void forEach(BiConsumer? super K, ? super V action) {Objects.requireNonNull(action);for (Map.EntryK, V entry : entrySet()) {K k;V v;try {k entry.getKey();v entry.getValue();} catch(IllegalStateException ise) { // this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);} action.accept(k, v);} }上述代码作用是对Map中的每个映射执行action指定的操作。 代码如下示例 package demo4;import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.function.BiConsumer; import java.util.function.Consumer;public class Collection {public static void main(String[] args) {HashMapInteger, String map new HashMap();map.put(1, 委婉待续);map.put(2, love);map.put(3, 石老师);map.put(4, forever);map.forEach(new BiConsumerInteger, String(){Overridepublic void accept(Integer k, String v){System.out.println(k v);}});}}结果显示 使用lambda表达式后的代码 package demo4;import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.function.BiConsumer; import java.util.function.Consumer;public class Collection {public static void main(String[] args) {HashMapInteger, String map new HashMap();map.put(1, 委婉待续);map.put(2, love);map.put(3, 石老师);map.put(4, forever);map.forEach((k, v)-System.out.println(k v));}}测试结果 4、总结 Lambda表达式的优点很明显在代码层次上来说使代码变得非常的简洁。缺点也很明显代码不易读。 优点 1. 代码简洁开发迅速 2. 方便函数式编程 3. 非常容易进行并行计算 4. Java 引入 Lambda改善了集合操作 缺点 1. 代码可读性变差 2. 在非并行计算中很多计算未必有传统的 for 性能要高 3. 不容易进行调试 ps本次的内容就到这里了如果喜欢的话就请一键三连哦
http://www.zqtcl.cn/news/452961/

相关文章:

  • 网站建设如何定位网站建设思路方向
  • 手机网站拦截怎么解除网站生成软件免费制作
  • 中国房地产网站茂名住房和城乡建设厅网站
  • 做网站销售工资怎么样网页设计是哪个专业
  • 吉林省住房城乡建设厅网站首页微商城模板包含哪些
  • 优秀个人网站案例wordpress 文章格式
  • 2019年做网站装修平面设计图的制作
  • 潍坊网站建设top淘宝客网站名
  • 怎么给网站做外链网上接效果图平台
  • 电影网站建设教程下载怎么经营团购网站
  • 做网站卖什么建设银信用卡网站首页
  • 大连市城乡建设档案馆网站网上竞价采购网站建设
  • 国际物流公司网站建设浏览器正能量网站免费图片
  • 河南做外贸网站的公司怎么做家庭网站
  • 知名营销类网站互联网软件开发是什么工作
  • 做网站前新闻录入网站模板
  • 网站域名做跳转要收费吗科技信息期刊
  • 登别的网站应怎么做网站推广广告词大全集
  • 漯河城乡建设管理局网站wordpress icon class
  • 买空间哪个网站好广州多少网络科技有限公司
  • 网站的网络推广方案营销型网站建设论文
  • 苏州做网站便宜的公司哪家好门店管理系统app
  • 学校多语言网站建设网络维护网站建设培训
  • Wordpress外贸网站搭建公司建站系统的应用场景
  • 网站推广网络推广方wordpress汉语公益
  • 长沙做网站的公司有哪些宁波奉化建设局网站
  • 温岭专业自适应网站建设承德招聘信息网
  • 做公司网站的模板下载wordpress e
  • 网站建设基本知识wordpress 没有小工具
  • 北京完美建设有限公司网站酒店加盟