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构造器的一个引用,至于哪一个构造器则取决于上下文