zoukankan      html  css  js  c++  java
  • 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.  模板

  • 相关阅读:
    iOS推送通知
    KVO内部实现原理
    沙盒目录结构
    UITableView的常用属性和代理方法
    优秀文章的链接
    c++面试题
    递归练习
    c#连接mysql环境配置
    mysql命令详解
    十进制转二进制
  • 原文地址:https://www.cnblogs.com/xieboke/p/6687070.html
Copyright © 2011-2022 走看看