/* Lambda表达式基础语法 【拷贝小括号 + 写死右箭头 + 落地大括号】 java8中引入了一个新的操作符 -> 箭头操作符或Lambda操作符 箭头操作符将Lambda表达式拆分成两部分
左侧:Lambda表达式的参数列表右侧:Lambda表达式中所需要执行的功能,即Lambda体语法格式一: 无参数、无返回值 () -> System.out.println("Hello Lambda")语法格式二: 有一个参数,并且无返回值 (x) -> System.out.println(x)语法格式三: 若只有一个参数,小括号可以省略不写 x -> System.out.println(x) 语法格式四: 有两个以上参数,有返回值,并且Lambda体中有多条语句 Consumercon = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); }语法格式五: 若Lambda体中只有一条语句,return和大括号都可以省略不写Consumer con = (x, y) -> Integer.compare(x, y);语法格式六: Lambda表达式的参数列表的数据类型可以省略,因为jvm编译器可以通过上下文推断出数据类型 x -> System.out.println(x)
左右遇一括号省 左侧推断类型省
Lambda表达式需要函数式接口的支持 函数式接口:接口中只有一个抽象方法的接口,称为函数式接口 可以使用@FunctionalInterface修饰,可以检查是否是函数式接口
*/ public class TestLambda2{
public void test3(){ Consumercon = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); }}public void test2(){ Consumer con = (x) -> System.out.println(x); con.accept("牛逼");}List emps = Arrays.asList( new Employee("张三",18,9999), new Employee("李四",38,9999), new Employee("王五",50,9999), new Employee("赵柳",16,9999), new Employee("田七",8,9999),);public void test3(){ Collections.sort(emps, (e1, e2) -> { if(e1.getAge() == e2.getAge()){ return e1.getName().compareTo(e2.getName()); }else{ return Integer.compare(e1.getAge(), e2.getAge()) } }); for(Employee emp : emps){ System.out.println(emp); }}
}
/* 四大内置核心函数式接口
Consumer:消费型接口 void accept(T t);Supplier :供给型接口 T get();Function :函数型接口 R apply(T t);Predicate :断言型接口 boolean test(T t);
*/ public class TestLambda3{
// Predicate:断言型接口public void test4(){ List list = new Arrays.asList("hello","ageget","lambda","ok") List strList = filterStr(list, (s) -> s.length() > 3); for(String str : strList){ System.out.println(str); }}// 将满足条件的字符串放入集合中public List filterStr(List list, Predicate pre){ List strList = new ArrayList<>(); for(String str : list){ if(pre.test(str)){ strList.add(str); } } return strList;}// Function :函数型接口public void test3(){ String newStr1 = strHandler(" 大吉大利 ", (str) -> str.trim()); System.out.println(newStr1); String newStr2 = strHandler(" 大吉大利 ", (str) -> str.substring(2,4)); System.out.println(newStr2);}// 用于处理字符串public String strHandler(String str, Function fun){ return fun.apply(str);} // Supplier :供给型接口public void test2(){ List numList = getNumList(10, () -> (int)(Math.random() * 100)) for(Integer num : numList){ System.out.println(num); }}// 产生指定个数的整数并放入集合中public List getNumList(int num, Supplier sup){ List list = new ArrayList<>(); for(int i=0; i :消费型接口public void test1(){ happy(10000, (m) -> System.out.println("大宝剑" + m + "元"))}public void happy(double money, Consumer con){ con.accept(money);}
}
/* 方法引用: 若Lambda体中的内容有方法已经实现了,我们可以使用 方法引用 (可以理解为方法引用是Lambda表达式的另外一种表现形式)
主要有三种语法格式: 对象::实例方法名 类::静态方法名 类::实例方法名
*/ public class TestMethodRef{
// 对象::实例方法名public void test1(){ Consumercon = (x) -> System.out.println(x); PrintStream ps1 = System.out; Consumer con1 = (x) -> ps1::println(x); PrintStream ps = System.out; Consumer con1 = ps::println; Consumer con2 = System.out::println; con2.accept("abcd");}
}
// Stream API 练习
public class TestStreamAPI{
/* 1. 给定一个数字列表,如何返回一个由每个数的平方构成的列表 给定1,2,3,4,5 返回 1,4,9,16,25
*/ public void test1{ Integer[] nums = new Integer[]{1,2,3,4,5};
Arrays.stream(nums) .map((x) -> x * x) .forEach(System.out:println);}
/* 2. 怎样用map和reduce方法数一数流中有多少个Employee */
Listemps = Arrays.asList( new Employee("张三",18,9999), new Employee("李四",38,9999), new Employee("王五",50,9999), new Employee("赵柳",16,9999), new Employee("田七",8,9999));public void test2{ Optional count = emps.stream() .map((e) -> 1) .reduce(Integer::sum); System.out.println(count.get());}
}
public interface MyFun{ default String getName(){ return "hhb"; } }