java8的新特性;例子sort()方法需要一个比较的计算方式;才能进行排序;这个计算方式可以理解为一段代码块吧,要用这个代码块往往需要建立一个对象;设置一个方法;把代码块放入方法里
这里只是打个比方
class LengthComparator implements Comparator<String>
{
public int compare(String first, String second)
{
return first.length() - second.length(); //ps:这行才是sort()方法需要的;其它的对sort而言无用
}
}
然后往sort()方法里面传递对象;实现字符串数组的排序
strings是一个字符串数组
Arrays.sort(strings, new LengthComparator()); 这么写的话是有点繁琐,写了很多与需要代码无关的代码,
所以为了简洁一点出现了lambda表达式;含义:带参数变量的表达式被称为lambda表达式
(String first, String second) -> first.length() - second.length() //这就是一个代码块;lambda表达式
lambda表达式:参数,箭头,一个表达式(或一个代码块)例如:(String first, String second) -> {...}
sort()方法是允许用lambda表达式的
然后sort()去调用它
Arrays.sort(strings, (String first, String second) -> first.length() - second.length());//lambda该表达式的返回类型会根据上下文推导得出;first.length() - second.length()的结果是一个int类型;
这样比创建实现特定的接口的一个类一个方法,然后在方法里面放入需要的计算方式(代码块)简单一些;这个只是最基本的lambda表达式写法,lambda表达式还有更简洁的;这里也不能完全展示lambda表达式的威力;、
lambda表达式的书写规则:
1. (String first, String second) -> first.length() - second.length() 参数,箭头(->), 表达式
2. 如果lambda表达式没有参数,空括号也要必须写
() -> {
for (int i = 100; i >= 0; i--)
System.out.println(i);
}
3. 如果可以推导出一个lambda表达式的参数类型,则可以忽略其类型
Comparator<String> comp = (first, second) -> first.length() - second.length();
这个lambda表达式赋给一个字符串比较器;所以first,second推导出是String类型
这里你可以是看作根据lambda表达式建立了一个匿名对象和非匿名方法(与接口的抽象方法同名);这个匿名对象实现了Comparator接口;非匿名方法的返回类型 根据lambda表达式上下文结果推导得出(这是编译器的工作;应该之后编译器会加上某些代码然后才会交给解释器)
4. 如果lambda表达式只有一个参数,而且这个参数类型可以推导出的话;甚至还可以省略小括号
ActionListener listener = event -> System.out.println("The time is " + new Date());
这里你可以看成根据lambda表达式建了一个匿名对象和非匿名方法(与接口抽象方法同名);然后listener引用这个匿名对象
非匿名方法的返回类型是根据上下文结果推出的;这里的返回类型应该是void;因为除了一条
System.out.println("The time is " + new Date());语句 没有结果值需要返回;
所以有一个问题
假如:
(int x) -> { if (x >=0) return 1; } 这样是不合法的,无法确定返回类型;当x >= 0时 返回类型时int类型 当x<0时返回类型时void 无返回值类型 编译器就无法判断了,所以 能让编译器准确推导出返回类型的lambda表达式才合法
另外;函数式接口与lambda表达式兼容;也就是需要这种接口的一个对象时(接口的实现),可以去提供一个lambda表达式(可以看作时根据lambda表达式生成一个实现该接口的匿名对象,在非匿名方法里放入表达式的计算方式,lambda表达式上下文结果推出的返回类型要符合接口中抽象方法的返回类型)
函数式接口:只有一个抽象方法的接口;(估摸着有两个抽象方法的话,无法判定lambda表达式的计算代码块填充到哪个抽象方法里,或者说这两个抽象方法都需要实现;但是根据lambda表达式生成的匿名对象只能实现一个方法,所以估摸着 抽象方法必须只有一个的接口就才能称之为 函数式接口
共同学习,写下你的评论
评论加载中...
作者其他优质文章