Java8之Lambda表达式

一. Lambda表达式 1.1基础语法 Java8中引入了一个新的操作符“->”:箭头操作符或者lambda操作符。
箭头左侧:Lambda表达式的参数列表:对应所实现接口抽象方法的参数列表。
箭头右侧:Lambda表达式所需要执行的功能:对应接口抽象方法的实现。
以上所提接口,均指新的函数式接口,也就是只有一个抽象方法的接口。
1.2语法格式(1) 无参数,无返回值:
() -> System.out.println(“Hello”);
1.3语法格式(2) 有一个参数,无返回值:
(param)-> syso
【只有一个参数时,小括号可以省略不写,建议写】
param -> syso
1.4语法格式(3) 有2个以上的参数,Lambda体中有多条语句,有返回值。Lambda体必须使用{}包裹
多参数,若只有一条语句,有返回值,{}和return都可以省略。
1.5语法格式(4) Lambda的参数列表的数据类型可以省略不写。因为JVM编译器可以通过上下文推断出其对于的类型,也就是“类型推断”。

(Integer x, Integer y) -> Integer.compare(x, y);

总结:
Lambda表达式之能省则省 左右遇一括号省 左侧推断类型省

Lambda表达式需要函数式接口的支持。
函数式接口:若接口中只有一个抽象方法,则称之为函数式接口。接口可以使用注解
@FunctionInterface修饰,且用这个注解修饰的接口,只能有一个抽象方法。
实际应用:
Java8之Lambda表达式
文章图片

Java8之Lambda表达式
文章图片

输出: 10000和400
二.四大函数式接口 Java8之Lambda表达式
文章图片

简单举例:
//##########Consumer########## @Test public void consumerTest() { happy(1000, (money) -> System.out.println("我去吃螃蟹,消费了" + money + "元!")); } public void happy(double money, Consumer csm) { csm.accept(money); }// ##########Supplier########## @Test public void suppTest() { List list = getRInt(10, () -> (int)(Math.random()*100)); for (Integer integer : list) { System.out.println(integer); } } public List getRInt(int num, Supplier supplier) { List list = new ArrayList<>(); for (int i = 0; i < num; i++) { list.add(supplier.get()); } return list; } // ##########Function########## @Test public void funcTest() { String strHandler = strHandler("abcde", (str) -> str.toUpperCase()); System.out.println(strHandler); } public String strHandler(String str, Function, String> fun) { return fun.apply(str); }// ##########Predicate########## @Test public void predicateTest() { List> myList = Arrays.asList("hello", "wdy", "ok","world"); List> resultList = strFilter(myList, (s) -> s.indexOf("o") != -1); for (String string : resultList) { System.out.println(string); } } public List> strFilter(List> list, Predicate> predicate) { List> strList = new ArrayList<>(); for (String string : list) { if (predicate.test(string)) { strList.add(string); } } return strList; }

三.方法引用和构造器引用 3.1 方法引用
以userList为例 ,通过 《类名::方法名》的方式操作数据
class User { private String userName; private Integer age; } List users = new ArrayList<>(); users.stream() .map(User::getUserName) .forEach(System.out::println)

3.2 构造器引用
// 比如我们有员工列表,里面放的员工,员工有name属性,我们要将name单独取出,并放到set中去 HashSet> hs = emps.stream() .map(Employee::getName) .collect(Collectors.toCollection(HashSet::new)); // HashSet::new 这就是构造器引用

【Java8之Lambda表达式】以上这些都是针对Lambda表达式的应用。比较偏理论。多练习就容易理解了。

    推荐阅读