一、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, Functionfunction) { // 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, Consumerconsumer) { // 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(Suppliersupplier) { // 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, Predicatepredicate) { // 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)