0616 Java核心技术卷1

6.2接口实例

1.接口与回调

  回调是一种常见的程序设计模式,在这种模式中,可以指出某个特定事件发生时应该采取的动作,

2.comparator接口

   该接口可以实现对字符串数组的排序

3,对象克隆

  为一个包含对象引用的变量建立副本的时候,任何一个变量的改变都会影响另一个变量

    Employee original = new Employee("John",50000);
    Employee copy = original;
    copy.raiseSalary(10);

  如果希望copy是一个新对象,它的初始状态与original相同,但是之后各自有自己不同的状态,这种情况下可以使用clone方法

  而只有Employee类可以克隆Employee对象

  如果对象中的所有数据域都是数值或其他基本类型,拷贝这些域没有任何问题、 但是如果对象包含子对象的引用,拷贝域就会得到相同子对象的另一个引用,这样一来,原对象和克隆的对象仍然会共享一些信息

// 浅拷贝
var obj1 = {
   'name' : 'zhangsan',
   'age' :  '18',
   'language' : [1,[2,3],[4,5]],
};
var obj3 = shallowCopy(obj1); //obj3为 对obj1浅拷贝 出现的对象
obj3.name = "lisi"; // 对基本数据域进行赋值 不会影响到obj1
obj3.language[1] = ["二","三"]; // 对子对象进行赋值 影响到obj1
function shallowCopy(src) {
   var dst = {};
   for (var prop in src) {
       if (src.hasOwnProperty(prop)) {
           dst[prop] = src[prop];
       }
   }
   return dst;
}
console.log('obj1',obj1)
console.log('obj3',obj3)

 6.3 lambda表达式

1.为什么引用lambda表达式

  lambda表达式是一个可传递的代码块,可以在以后执行一次或多次,而在java中不可以直接传递代码段,必须构造一个对象,而对象的类需要有一个方法包含代码段

2.lambda表达式的语法

我们传入代码来检查一个字符串是否比另一个字符串短:

first.length()-second.length();

first和second都是字符串,Java是一种强类型语言,所以我们要指定它们的类型

  (String first, String second)

    -> first.length() - second.length()

这就是所见到的第一个lambda表达式,lambda表达式就是一个代码块,以及必须传入代码的变量规范

lambda表达式形式:参数,箭头(->) 以及一个表达式,如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,把这些代码放入{}中,并包含显式的return语句,例如:

(String first,String second) -> {
    if (first.length() < second.length() ) return -1;
    else if (first.length() > second.length() ) return 1;
    else return 0
}

即使lambda表达式没有参数,仍然要提供空括号,就像无参数方法一样:

() -> { 
for(int i =100; i >=0; i--)
    System.out.println(i);
}

无需指定lambda表达式的返回类型,lambda表达式的返回类型总是会由上下文推导得出

3.函数式接口

  对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式,这种接口称为函数式接口

lambda重写了接口中的唯一一个方法,重写的内容就是lambda语句

4.方法引用

  如果可以直接把println方法传递到构造器里就很方便,如:

  Timer t = new Timer(1000,System.out::println);

  表达式System.out::println是一个方法引用,它等价于lambda表达式:x -> System.out.println(x);

从这些例子可以看出, 要用:: 操作符分隔方法名与对象或类名。主要有 3 种情况:•object::instanceMethod

•Class::staticMethod

•Class::instanceMethod

在前 2 种情况中,方法引用等价于提供方法参数的 lambda 表达式。前面已经提到,
System.out::println 等价于 x -> System.out.println(x) 类似地,Math::pow 等价于(x,y) ->
Math.pow(x, y)
对于第 3 种情况, 第 1 个参数会成为方法的目标。例如,String::compareToIgnoreCase 等
同于 (x, y) -> x.compareToIgnoreCase(y) 

5.构造器引用

  构造器引用和方法引用很类似,只不过方法名为new,例如: Person::new是Person构造器的一个引用,至于哪一个构造器则取决于上下文

猜你喜欢

转载自www.cnblogs.com/aLin002/p/13141101.html