学习笔记二 方法引用
1.方法引用时使用双冒号法(::)将实例引用或类名与方法分开。
2.如果说lambda表达式本质上是将方法作为对象进行处理,那么方法引用就是将现有方法作为lambda表达式进行处理。3.举几个例子:
(1)依次打印出流中的数据
使用匿名内部类表达式:
Consumer<Integer> printer=new Consumer<Integer>(){ public void accept(Integer t) { System.out.println(t);
}
};
Stream.of(3,1,4,1,5,9).forEach(printer); //返回包含元素的顺序流并依次打印在控制台使用lambda表达式:
Stream.of(3,1,4,1,5,9).forEach(x->System.out.println(x));使用方法引用:
Stream.of(3,1,4,1,5,9).forEach(System.out::println);将方法引用赋给函数式接口:
Consumer<Integer> printer=System.out::println;
Stream.of(3,1,4,1,5,9).forEach(printer);释:
a.forEach方法中传入的参数是函数式接口Consumer,可用作lambda表达式或方法引用的赋值对象,它的单一抽象方法为accept。
b.方法引用可以看成是对lambda表达式的方法体(System.out.println(x))进行改写,用双冒号把实例System.out和方法println的分开。
c.在方法引用中,无须参数,末尾也无须括号。
d.在本例中System.out实例的方法println与accept的方法签名相互兼容。
e.本例采用的是方法引用的第三种形式:引用特定对象的实例方法。
(2)依次打印出随机产生的数据
使用lambda表达式:
Stream.generate(()->Math.random()).limit(10).forEach(System.out::println);使用方法引用:
Stream.generate(Math::random).limit(10).forEach(System.out::println);释:
a.generate方法的功能是产生一个无限流,传入函数式接口Supplier作为参数,其唯一的抽象方法为get。
b.Math类的ramdom方法与get方法的签名相互兼容。
c.limit方法限定只生产十个值。
d.本例采用的是方法引用的第二种方式:引用静态方法。
(3)对字符串进行排序并打印输出
使用lambda表达式:
List<String> strings=Arrays.asList("this","is","a","list","of","strings"); //将字符串数组转换为List集合 strings.stream().sorted((s1,s2)->s1.compareTo(s2)).forEach(System.out::println); //如果通过类名引用一个传入多个参数的方法,则第一个元素作为方法的目标,即s1,其它元素作为方法的参数,本例中为s2.使用方法引用:
List<String> strings=Arrays.asList("this","is","a","list","of","strings"); strings.stream().sorted(String::compareTo).forEach(System.out::println);释:
a.sorted方法传入函数式接口Comparator(T)作为参数,其单一的抽象方法为int compare(String other)。
b.在流处理中,如果处理一系列输入,则会频繁使用方法引用中的类名来访问实例方法。例如本例会频繁使用String这个类名来访问compareTo方法对字符串进行比较操作。
c.本例采用的是方法引用的第三种形式:调用特定类型的任意对象的实例方法。
(4)计算一系列字符串的长度并打印输出
使用lambda表达式:
Stream.of("this","is","a","stream","of","strings").map(s->s.length()).forEach(System.out::println); 使用方法引用:Stream.of("this","is","a","stream","of","strings").map(String::length).forEach(System.out::println); a.本例采用的是方法引用的第三种形式:调用特定类型的任意对象的实例方法。4.总结
(1)如果编写一个只有一行的lambda表达式俩调用方法,可以使用方法引用来替代,方法引用往往更短。
(2)方法引用省略参数,也省略方法的括号。
(3)方法引用包括以下三种形式:
a.引用特定对象的实例方法,如System.out::println。
b.引用静态方法,如Math::max。
c.调用特定类型的任意对象的实例方法,如String:length。
(4)方法引用本质上属于lambda表达式的一种简化语法。lambda表达式在实际中更常见,因为每个方法引用都存在一个等效的lambda表达式,反之则不然。#笔记#
OPPO公司福利 1254人发布