函数式接口及lambda表达式相关

0.why lambda?

简化代码,紧凑结构。

代码简洁程度:外部类->内部类->匿名内部类->lambda->方法引用

使用场合:通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数

parameters –> a expression;

or (parameters)->{expressions ; }; 注意要有返回值。

参数可为空:以()表示。

1.lambda表达式在java8中的实现形式

Lambda表达式生成了一个内部类。

参考博文 https://www.cnblogs.com/WJ5888/p/4667086.html#

此博文在分析lambda表达式的时候,采用了①直接javap生成字节码文件的分析②反证法,通过自己创建了一个与从字节码文件反编译得到的方法同名的方法来反面证明自己的设想;

侧面证明了:lambda表达式会首先被编译为一个  私有的静态函数!

查看字节码文件之前就会,而博主根据反证法来验证自己的想法,此处学习了。

其后,该表达式会生成一个内部类。

core java volume中,将lambda表达式安排在紧挨着接口及内部类看来确有深意。

此处添加了  -Djdk.internal.lambda.dumpProxyClasses 指令,可以将生成的内部类字节码输出到一个文件中。

2.函数式接口的实现对象

该对象实现了将方法作为参数传递给方法或者返回一个方法的作用

故而,该接口应当有且仅有一个未实现的方法,以指明该实现对象将向何方法传递参数。

lambda表达式不能脱离函数式接口而独立存在。即函数式接口是Lambda表达式的目标类型。

3.方法引用

why 方法引用?

有时使用lambda表达式创建匿名方法时  仅仅时调用了已存在的方法。故可将lambda表达式简化为方法引用。

1.方法引用

①Object:instanceMethod ②Class:staticMethod ③Class:instanceMethod

使用方法              参数::方法名             (该参数应匹配该方法的参数列表,且返回值也应匹配)             -------------------------------->方法①②

若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: 类名::实例方法名 --------->方法③ 如下:

Arrays.sort(array,String::compareToIgnoreCase);

Arrays.sort(array,(a,b)->a.compareToIgnoreCase(b));

2.构造方法引用

①Class::new ②Class[]::new

 

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.stream.Stream;

/**
* author:wanghuanyeah
* 2019/10/26
* 8:37
*/
public class Test {
public static void main(String[] args) {
/* new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
}).start();*/

/* new Thread( ()-> System.out.println("hellowhh")).start();*/

String[] array={"aaaa","bbb","c","36"};
Integer[] is={5,88,66,11,9999};

Comparator<Integer> comparator=(v1,v2)->Integer.compare(v1, v2);
Arrays.sort(is,comparator);
Stream.of(is).forEach(System.out::println);

System.out.println("**************************************************");
Arrays.sort(array, (e1,e2)->Integer.compare(e1.length(), e2.length()));
Stream.of(array).forEach(System.out::println);

System.out.println("**************************************************");
Arrays.sort(array,String::compareToIgnoreCase);
Arrays.sort(array,(a,b)->a.compareToIgnoreCase(b));
Stream.of(array).forEach(System.out::println);

System.out.println("**************************************************");
BiPredicate<String,String> biPredicate=String::equals;
System.out.println(biPredicate.test("wanghuan", "wanghuan"));
}

@Test
public void test(){
List<Integer> list = Arrays.asList(1, 2, 9, 4, 5, 7, 5, 8, 3);
List<String> strl=Arrays.asList("aaa","bb","c","wwww","hh");
//1
//list.sort((i1,i2)->(i1-i2));
//2
/*list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});*/
//3
list.sort(Integer::compareTo);

//1
//strl.sort((st1,st2)->(st1.length()-st2.length()));
//2
/*strl.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});*/
//3
strl.sort(String::compareTo);

//1
/*list.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});*/
//2
//list.forEach((a)-> System.out.println(a));
//3

/*Stream.of(list).forEach(System.out::println);
list.forEach(System.out::println);*/
//stream流的foreach 是内部迭代的过程
    //而collection 的foreach   仍为迭代器的底层实现结果
Stream.of(strl).forEach(System.out::println);
strl.forEach(System.out::println);
}
}

 

条件硬编码改写为使用断言函数接口,减少代码量。

即 以断言函数接口的实现类为 条件过滤方法的参数。

每次修改过滤条件时仅需修改断言条件,而不用增改源码

 

发现个新写法,初始化集合时,使用匿名内部类及实例化方式来简化代码:

        HashMap<String,String> hashMap = new HashMap<String,String>(){{put("num","5");put("age","6");}};

 

posted @ 2019-11-01 19:57  wanghuanyeah  阅读(352)  评论(0)    收藏  举报