• 20155335俞昆《java程序设计》第七周总结


    学号  2016-2017-2  《Java程序设计》第X周学习总结

    ##  教材学习内容总结

    Lambda  的语法概览

    String[]  names={“Justin”,”caterpillar”,”bush”}

    Array.sort(names,new  Comparator<string>(){

          Public  int  compare(String  name1,String  name2)  {

                  Return  name1.length()-name2.length;

    });

    Arrays的sort访法可以用来排序,只不过,必须知道两个元素的比较顺序,sort()规定要操作java.Util.Compatator来说明这件事。

    通过变量bylength,确实是让排序意图清楚许多,只是操作匿名类时依旧冗长,例如,声明byLength时已经写了一次Compatator<string>,匿名类操作时又要写一次Compatator<string>可以写为

    Compatator<string>byLength=(String  name1,String  name2)-.>name1.length()-name2.length();

    重复的Compatator<String>信息从等号右边去除了,原本的匿名类方法只有一个要操作,使用Lamaba表达式时,实际上从等号左边Compatator<string>声明就可以知道,Lamba表达式实际上要操作Compatator<string>中的Compare()方法,还有重复的信息,既然声明变量使用了Compatator<string>,为什么Lamba表达式参数上又得声明一次String?实际上却是不用,因为编译程序可以从byLength变量的声明类型,推断name1和name2的类型,可以在简化为

    Compatator<string>  bylength=(name1,name2)->name1.length-name2.length();

    可以将它直接放到Array的sort方法中去。

    编译程序可以从names推断,sort()方法的第二个参数类型实际上就是Compatator<string>,因而name1和name2还是不用声明类型,跟一开始匿名类写法相比较,程序代码却是简洁许多。

    如果许多地方都会有按字符串长度排序的需求,可以这样用。遇到在同一个方法内,就像之前用的byname局部变量,如果类中同一个方法间要共享,用一个byname数据成员,因为byname要参考的数据变量没有状态问题,因而声明为static比较适合,如果再多个类实现共享,设定为public  static  例如

    Package  cc。openhome

    Import.  java.Util.Arrays;

    Public  class  StrinfOrderDemo{

    Public  static  void  main(String[]  args){

    String[]  names={“Justin”,”caterpillar”,”Bush”};

    Arrays.sort(names,StringOrder::byLength);

    System.out.peintIn(Arrays.toString(names));

      }

    }

    除了方法名称之外,bylength方法签署了与Compatator的Compare方法相同,你只在Lamba表达式将参数是s1和s2传给bylength方法,可以直接重用bylength方法的操作不是更好吗?

            在java中引入lamba的同时,与现有API维持兼容性的主要考虑之一。方法参考特性

    在java中引入Lamba的同时,与现有API维持兼容性是主要考虑。重用现有方法操作,可以避免到处写下Lamba表达式。上面的例子是运用了方法参考的一种形式,也就是参考现有的static方法。

              现在看另一个需求,如果按字典顺序排序名称?因为已经定义了StringOrder,这么撰写

              String[]  names={“Justin”,”caterpillar”,”bush”};

              Arrays.sort(names,StringOrder::byLexicography);

    StringOrder的byLexicography()方法操作中,只不过将调用String的ComparTo方法,就是将参数s1作为compareTo的接受者,第二个参数s2作为compare()的参数,在这种情况下,其实我们可以直接参考String类的compareTo方法,例如

    import  java.util.Arrays;

    public  class  StringDemo{

    public  static  void  main  (String[]  args){

    String[]    names={"justin","caterpillar","bush"};

    Arrays.sort(names,String::compareTo);

    System.out.printIn(Array.toString(names));

    }

    }

    类似的,想对名称按照字典顺序排序,但忽略大小写差异,也不用通过StringOrder的static方法了,只需参考String中的compareToIgnoreCase方法:

    String[]  names={“Justin”,”caterpillar”,”bush”};

    Array.sort(names,String::compareToIgnoreCase);

    可轻易的观察到,方法参考不仅可以避免重复撰写Lamdba表达式,也可以让程序代码更为清楚。这边只是初尝以下Lamdba的甜头,关于Lamdba还有更多细节,后续会再注意探讨。

    Lamdba表达式

    已知以下程序代码,

    Comparator<string>  byLength  =

                  (String  name1,String  name2)->name1.length()-name2.length();

    可以拆开为两部分,等号右边是lamdba表达式,等号左边是作为lamdba表达式的目标类型,看看等号右边的lamdba表达式:

    (String  name1,String  name2)->name1.length()-name2.length();

    这个Lamdba表达式表示接受两个参数name1和name2,参数都是String类型,目前右边定义了会返回结果的单一表达式,如果运算比较复杂,必须使用多行描述,可以加入{}定义描述区块。如果有返回值,必须加上return,例如:

    (String  name1,String  name2)->{

                      String  name1=name1.trim();

                      String  name2=name2.trim();

                      …

                      Return  name1.Length()-name2.Length();

        }

    Lambda表达式中,即使不接受任何参数,也必须写下括号。例如;

    ()—>”Justin”//不接受任何参数,返回字符串

    ()—>System.out.printIn()//不接受参数,没有返回值

          在只有Lamdba表达式下,参数类型必须写出来,如果有目标类型的话,在编译程序可推断出类型的情况下,就可以不用写出Lanbda表达式的参数类型,实际上是String,因而就不用写出参数类型。

    Compatator<string>byLength=(name1,name2)—>name1.length()-name2.length();

          Lamdba的表达式本身是中性的,不代表任何类型的实例,同样的Lambda的表达式,可用来表示不同目标类型的操作对象,举例而言,上面的范例用来表示Compparator<string>操作。

    尽量简单的总结一下本周学习内容

    尽量不要抄书,浪费时间

    看懂就过,看不懂,学习有心得的记一下

    ##  教材学习中的问题和解决过程

    -  问题1:XXXXXX

    -  问题1解决方案:XXXXXX

    -  问题2:XXXXXX

    -  问题2解决方案:XXXXXX

    -  ...

    ##  代码调试中的问题和解决过程

    -  问题1:XXXXXX

    -  问题1解决方案:XXXXXX

    -  问题2:XXXXXX

    -  问题2解决方案:XXXXXX

    -  ...

    ##  [代码托管](码云学习项目链接)

    http://git.oschina.net/tianmaxingkomg/xinjianxianmu

    (statistics.sh脚本的运行结果截图)

    ##  上周考试错题总结

    -  错题1及原因,理解情况

    -  错题2及原因,理解情况

    -  ...  

    ##  结对及互评

    ###  评分标准

    1.  正确使用Markdown语法(加1分):

            -  不使用Markdown不加分

            -  有语法错误的不加分(链接打不开,表格不对,列表不正确...)

            -  排版混乱的不加分

    2.  模板

  • 相关阅读:
    现代软件工程 第一章 概论 第4题——邓琨
    现代软件工程 第一章 概论 第9题——邓琨
    现代软件工程 第一章 概论 第7题——张星星
    现代软件工程 第一章 概论 第5题——韩婧
    hdu 5821 Ball 贪心(多校)
    hdu 1074 Doing Homework 状压dp
    hdu 1074 Doing Homework 状压dp
    hdu 1069 Monkey and Banana LIS变形
    最长上升子序列的初步学习
    hdu 1024 Max Sum Plus Plus(m段最大子列和)
  • 原文地址:https://www.cnblogs.com/xieboke/p/6687070.html
Copyright © 2020-2023  润新知