lambda表达式基础语法及其使用
1、无参、无返回值
@Test public void test00() { Runnable r1 = new Runnable() { @Override public void run() { System.out.println("Lambda01.test01().new Runnable() {...}.run()"); } }; r1.run(); }
2、无参、无返回值
@Test public void test01() { Runnable r2 = () -> System.out.println("hello lambda !"); r2.run(); }
3、有一个参数、且无返回值(有一个参数小括号可以省略不写)
@Test public void test02() { Consumer<String> con = (x) -> System.out.println(x); // Consumer<String> con = x -> System.out.println(x); con.accept("this is consumer!"); }
4、如果有2个参数、有返回值,函数体中有多条语句要用{}和return
@Test public void test03() { Comparator<Integer> com = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); }; System.out.println(com.compare(3, 2)); }
5、如果有2个参数、有返回值,函数体中只有一条可以省略{}和return
@Test public void test04() { Comparator<Integer> com = (x, y) -> Integer.compare(x, y); System.out.println(com.compare(3, 2)); }
6、需求:对一个数进行运算
@Test public void test05() { System.out.println(operate(100, (x) -> x + x)); System.out.println("-------------------"); System.out.println(operate(100, (x) -> x * x)); } private Integer operate(Integer num, LambdaFun01 lf) { return lf.getValue(num); }
package com.zh.lambda; @FunctionalInterface public interface LambdaFun01 { Integer getValue(Integer t); }
(1)lambda表达式需要函数式接口的支持
(2)函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。可以使用@FunctionalInterface修饰
1 调用Collertions.sort()方法,通过定制排序比较两个Employee(先按年龄比,年龄相同按姓名比),使用Lambda作为参数传递。
2 ①声明函数式接口,接口中声明抽象方法,public string getValue(string str);
②声明类Testlambda,类中编写方法使用接口作为参数,将一个字符串转换成大写,并作为方法的返回值。
③再将一个字符串的第2个和第4个索引位置进行截取子串。
3 ①声明一个带两个泛型的函数式接口,泛型类型为<T,R>T为参数,R为返回值
②接口中声明对应抽象方法。
③在Testlambda类中声明方法,使用接口作为参数,计算两个long型参数的和。
④再计算两个long型参数的乘积。
List<Employee> emps = Arrays.asList(// new Employee(20, "张三", 5000.35), // new Employee(40, "李四", 6500.63), // new Employee(30, "王五", 4000.93), // new Employee(50, "赵六", 9005.36), // new Employee(10, "马七", 1050.93), // new Employee(20, "朱八", 3000.73)// ); // 1、无参、无返回值 @Test public void test01() { Collections.sort(emps, (e1, e2) -> { if (e1.getAge() == e2.getAge()) { return e1.getName().compareTo(e2.getName()); } else { return e1.getAge().compareTo(e2.getAge()); } }); for (Employee employee : emps) { System.out.println(employee); } } @Test public void test02() { String str1 = strHandler("asdfasdfasdf", x -> x.toUpperCase()); System.out.println(str1); String str2 = strHandler("asdfasdfasdf", x -> x.substring(3, 5)); System.out.println(str2); } private String strHandler(String str, LambdaFun02 lFun02) { return lFun02.getValue(str); } @Test public void test03() { calc(10l, 20l, (l1, l2) -> l1 + l2); calc(10l, 20l, (l1, l2) -> l1 * l2); } private void calc(Long l1, Long l2, LambdaFun03<Long, Long> lambdaFun03) { System.out.println(lambdaFun03.getValue(l1, l2)); }
7、函数LambdaFun02
package com.zh.lambda; @FunctionalInterface public interface LambdaFun02 { String getValue(String t); }
8、函数LambdaFun03
package com.zh.lambda; @FunctionalInterface public interface LambdaFun03<R, T> { R getValue(T t1, T t2); }