一、lambda表达式
1.lambda表达式采用的是函数式编程的概念:
() -> {}
2.lambda表达式代替的是匿名函数,并且只能用在函数式接口(有且只有一个抽象方法),在Java提供的类库中,函数式接口上都有@FunctionalInterface注解。lambda表达式中的{}就是对函数式接口里抽象方法的实现
//例子1:
//函数式接口:
@FunctionalInterface
public interface Employee{
public void getSalary(){
}
}
public static void main(String[] agrs) {
//匿名函数
Employee employee = new Employee(){
@Override
public void getSalary(){
System.out.println("111");
}
};
}
public static void main(String[] agrs) {
//lambda表达式代替匿名类
Employee employee = () -> {System.out.println("111");};
}
//例子2:
@FunctionalInterface
public interface MyFunctionalInterface {
public void single(String msg);
}
public static void testonePar(MyFunctionalInterface myFunctionalInterface){
myFunctionalInterface.single("msg");
}
@Test
public void testoneParameter(){
testonePar(x-> System.out.println(x));
}
ps:lambda表达式可以代替匿名类:new FunctionalInterface(){},也可代替 FuntionalInterface functionInterface
3. lambda一些小规则:
//情况1
onlyOneParam -> onlyOneexpression;
//情况2
onlyOneParam -> onlyOneStatement;
//情况3
(param1,param2) -> {
String param = param1 + param2;
return param;
}
4.java8提供的常用函数式接口:
四大函数式接口:
1.函数型接口Function
提供任意一种类型的参数,返回另外一个任意类型返回值。 R apply(T t);
public class FunctionInterface {
public static void main(String[] args) {
String result = testFunction("Tim", (name) -> name + "Li");
System.out.println("result = " + result);
}
private static String testFunction(String name, Function function) {
// apply()方法为函数型接口Function的唯一抽象方法
return function.apply(name);
}
}
2.消费性接口Consumer
提供任意一种类型的参数,返回空值。 void accept(T t);
public class FunctionInterface {
public static void main(String[] args) {
testConsumer(2, x -> System.out.println("传入的数字为:" + x));
}
private static void testConsumer(int x, Consumer consumer) {
// accept()方法为消费性接口Consumer的唯一抽象方法
consumer.accept(x);
}
}
3. 供给型接口Supplier
参数为空,得到任意一种类型的返回值。T get();
public class FunctionInterface {
public static void main(String[] args) {
String result = testSupplier(() -> "hello Supplier");
System.out.println("result = " + result);
}
private static String testSupplier(Supplier supplier) {
// get()方法为供给型接口Supplier的唯一抽象方法
return supplier.get();
}
}
4. 断言型接口Predicate
提供任意一种类型的参数,返回boolean返回值。boolean test(T t);
public class FunctionInterface {
public static void main(String[] args) {
Boolean result = testPredicate("b", str -> str.equals("a"));
System.out.println("result = " + result);
}
private static Boolean testPredicate(String str, Predicate predicate) {
// test()方法为断言型接口Predicate的唯一抽象方法
return predicate.test(str);
}
}
二、方法引用
同lambda表达式,方法引用也可替代函数式接口,使代码更整洁。
方法引用主要有如下三种使用情况
(1). 类::实例方法
e.g.
String::compareToIgnoreCase 等同于 (x,y)->x.compareToIgnoreCase(y)
(2). 类::静态方法
(3). 对象::实例方法
(2)和(3)等同于lambda表达式,e.g.
System.out::println 等同于(x)->System.out.println(x) Math::pow 等同于(x,y)->Math.pow(x,y).
此外,方法引用还可以使用this::methodName及super::methodName表示该对象或者其父类对象中的方法
还有构造器、自由变量就先不在此赘述了,以后有机会可以看:java8之lambda表达式入门 - 【兰陵笑笑生】 - 博客园
二、 Stream



