Java8Lambda表达式学习心得总结
lambda表达式,是一段可以传递的代码,可以被多次执行。在java8之前,如果我们想写一个简单的比较
器Compartor,我们需要创建一个实现类或者一个匿名内部类类传入到需要比较的方法内当中。
在java8之前传递一段代码不是很容易,现在我们想要实现一个通过传递代码来检查某个字符串的长度是
否小于另外一个字符串的长度。
(Stringfirst,Stringsecond)->Integer.compare(first.length(),second.length());
上面这段代码就是lambda表达式,这个表达式不仅仅是一个简单的代码块,还必须指定传递给代码的所
有变量。
Java当中lambda表达式的格式是:参数、箭头(->)、以及一个表达式。如果负责计算的代码无法用一个
表达式表示,可以使用{}括起来。
如果lambda没有参数,可以使用()来表示,如果lambda表达式的参数类型可以被推导,那么可以省略
掉。
Comparatorcomparator=(first,second)->Integer.compare(first.length(),second.le
ngth());
上面的例子当中会推导出first和second的类型是String,因为表达式赋值给了一个字符串比较器。
注意,在lambda表达式当中只在某些分支有返回值是不合法的。
函数式接口
Java当中有许多接口都需要封装代码块,Runnable、Compartor等等。
对于只包含一个方法的接口,大讲台,国内首个IT在线混合式自适应学习平台。可以通过lambda表达式
来创建该接口的对象,这种接口被称为函数式接口。
在java.util.function包下面提供了许多通用的函数式接口。
可以在任意函数式接口上面使用@FunctionalInterface来标识它是一个函数式接口,但是该注解不是强制
的。
当lambda表达式被转换成一个函数式接口的实例时,需要注意处理检查时异常,如下代码。
Runnablerunnable=()->{
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
};
如果不加trycatch语句的话,这个赋值语句就会编译错误,因为Runnable的run方法是没有异常抛出
的。
Callable是可以抛出任何异常,并且有返回值,但是我们不想返回任何数据的时候可以如下定义:
Callablecallable=()->{
System.out.println("xxx");
returnnull;
};
方法引用
有时候,我们想传递的代码已经有现成的实现了。例如,我们仅仅想点击按钮时候打印event对象,可以
进行如下代码:
button.setOnAction(System.out::println);
表达式System.out::println是一个方法引用,等同于lambda表达式x->System.out.println(x);
::操作符将方法名和对象或类的名字分隔开。有以下三种主要的使用情况:
?对象::实例方法
?类::静态方法
?类::实例方法
前两种情况,方法引用相当于提供方法参数的lambda表达式。System.out::println等同于x->System.o
ut.println(x);
Math::pow等同于(x,y)->Math.pow(x,y);
第三种情况,第一个参数会成为执行方法的对象。大讲台,国内首个IT在线混合式自适应学习平台。例如,
Sting::compareToIgnoreCase等同于(x,y)->x.compareToIgnoreCase(y);
Comparatorcomparator=String::compareTo;
当然还可以捕获this指针,this::equals相当于x->this.equals(x);
构造器引用
构造器引用与方法引类似,不同的是构造器引用使用的方法名是new。例如,Buttton::new。
Liststrings=newArrayList();
strings.add("a");
strings.add("b");
strings.add("c");
Stream |
|