java8才提出的一种新语法。
1.lambda表达式本身就是一个参数,也是一个函数,可以传递给其他高阶函数。
只有一句的话,return都不要写
坚决不声明返回值的类型,没有权限的设置,单独语句不用大括号,写了return必须带大括号。
是为了保持参数的精简
lambda表达式与接口的关系:lambda表达式可以转化为接口对象。
Comparator<String> c = (String first, String second)-> first.length() - second.length();
lambda表达式自动填充变为接口方法的实现。
函数式接口:
自定义函数接口推荐使用FuctionalInterface
来注解,编译器就回来帮你检查。
大量的自定义的函数式接口使得源码膨胀
predicate:接收一个参数,返回boolean值(注意调用的是test方法)
Predicate<String> oddLength = s -> s.length()%2 == 0 ? false:true;
for(String p : palanets){
if(oddLength.test(p)){
System.out.println(p);
}
}
Consumer:接收一个参数,做操作,无返回
Supplier:无输入参数,返回一个数据
Function:接受一个参数,返回一个参数
lambda表达式支持传递现有的类库函数,这就被称为方法引用。格式是::
Comparator<String> c = (String first, String second)-> first.length() - second.length();
Arrays.sort(planets, (String first, String second)->first.length()-second.length());
Arrays.sort(palnets,String::compareToIgnoreCase);
自动填充接口的方法,这个玩意得好好理解呀。这个虽然不能算多态,但是同一个方法,同一类型的参数竟然可以运行处这么多不同的方法?
可以通过this指向自己,与其他的进行比较
super的引用:
通过new调用构造函数来调用函数
这里的new就会调用默认的person构造方法,调用s.get()
相当于调用了person的构造函数生成一个对象。
数组对象的创建:与前面的方法不一样的地方在于多了一个[]
lambda表达式应用
类型信息
同一个lambda表达式因为接口的不一致,其实可以产生不同的结果。
lambda表达式重载
根据类型参数自动选择合适的进行重载(这里就能判断其有没有返回值了???)
lambda表达式变量遮蔽
这里贴一段代码吧:
package lambda;
import java.util.function.Consumer;
public class LambdaScopeTest {
public int x = 0;
class FirstLevel{
public int x = 1;
void methodInFirstLevel(int x) {
Consumer<Integer> myConsumer = (y) ->
{
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("this.x = " + this.x);
System.out.println("LambdaScopeTest.this.x = " +
LambdaScopeTest.this.x);
};
myConsumer.accept(23);
}
}
public static void main(String[] args) {
LambdaScopeTest st = new LambdaScopeTest();
LambdaScopeTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(34);
}
}
输出结果为:
x = 34
y = 23
this.x = 1
LambdaScopeTest.this.x = 0
看这段代码就可以看懂哪些变量能够访问了。
lamdba表达式的this指代
package lambda;
public class ThisScopeTest {
private String name = "def";
public static void main(String[] args) {
new ThisScopeTest().test();
}
public void test() {
StringOperation obj = ()->
{
System.out.println(this.name);
System.out.println(getName());
System.out.println(StringOperation.name);
};
obj.operate();
}
public String getName() {
return this.name;
}
}
interface StringOperation{
String name = "abc";
public void operate();
}
输出结果为:
def
def
abc
lambda表达式与默认接口、静态方法、私有方法的区别与联系。
代码很短的时候建议使用lambda表达式