Lambda表达式概念
Lambda 表达式 百度百科:
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
lambda expression Wikipedia:
lambda expression in computer programming, also called anonymous function, a function (or a subroutine) defined, and possibly called, without being bound to an identifier
Lambda 表达式在计算机编程中也被称为匿名函数,即一个不用绑定指定标识符,但可以被调用的函数。
也就是说,Java中的Lambda表达式和Java中的匿名类是一样的,可以实现同样的功能。
Lambda表达式简化代码,提高开发效率,常和Stream联用。
Lambda表达式简单样例:
普通Java代码如:
1 @Test 2 public void test0() { 3 List<String> list = new ArrayList<>(); 4 list.add("a9"); 5 list.add("a0"); 6 list.add("a7"); 7 list.add("a1"); 8 Collections.sort(list, new Comparator<String>() { 9 10 @Override 11 public int compare(String o1, String o2) { 12 return o1.compareTo(o2); 13 } 14 15 }); 16 System.out.println(list); 17 }
output:[a0, a1, a7, a9].
Lambda 表达式代码如:
1 @Test 2 public void test1() { 3 List<String> list = new ArrayList<>(); 4 list.add("a9"); 5 list.add("a0"); 6 list.add("a7"); 7 list.add("a1"); 8 Collections.sort(list, (o1, o2) -> o1.compareTo(o2)); 9 System.out.println(list); 10 }
output:[a0, a1, a7, a9].
可见,Lambda表达式实现了匿名类的功能,并且较之更加简洁。
Lambda表达式与Stream联合使用:
Demo:
过滤map中值为1的键值对:
HashMap<String, Integer> obj = new HashMap<>(); obj.put("A", 1); obj.put("B", 0); obj.put("C", 0); obj.put("D", 1); Map<String, Integer> result = obj.entrySet().stream().filter(en -> (Integer) en.getValue() == 1) .collect(Collectors.toMap(Entry<String, Integer>::getKey, Entry<String, Integer>::getValue));
按单个条件分组 group:
package com.x.project.lambda; import com.alibaba.fastjson.JSON; import org.junit.Test; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Group { @Test public void multiConditionGroup() { People a = new People(); a.setName("小王"); a.setIdCardNum("a"); a.setHobby("吃鸡"); a.setAddr("1"); People b = new People(); b.setName("大王"); b.setIdCardNum("b"); b.setHobby("吃鸭"); b.setAddr("1"); People c = new People(); c.setName("老王"); c.setIdCardNum("c"); c.setHobby("吃鱼"); c.setAddr("2"); People d = new People(); d.setName("王王"); d.setIdCardNum("d"); d.setHobby("吃肉"); d.setAddr("2"); Map<String, List<People>> collect = Arrays.asList(a, b, c, d).stream().collect(Collectors.groupingBy(People::getHobby)); System.out.println(JSON.toJSONString(collect)); } } class People { String name; String idCardNum; String phone; String bankCardNum; String hobby; String addr; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIdCardNum() { return idCardNum; } public void setIdCardNum(String idCardNum) { this.idCardNum = idCardNum; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getBankCardNum() { return bankCardNum; } public void setBankCardNum(String bankCardNum) { this.bankCardNum = bankCardNum; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } }
output:{"吃鸭":[{"addr":"1","hobby":"吃鸭","idCardNum":"b","name":"大王"}],"吃鱼":[{"addr":"2","hobby":"吃鱼","idCardNum":"c","name":"老王"}],"吃鸡":[{"addr":"1","hobby":"吃鸡","idCardNum":"a","name":"小王"}],"吃肉":[{"addr":"2","hobby":"吃肉","idCardNum":"d","name":"王王"}]}
根据hobby分成了四组,每组一个元素,如果我们将People a 的hobby 设为"吃鱼",那么我们将会得到:
output:{"吃鸭":[{"addr":"1","hobby":"吃鸭","idCardNum":"b","name":"大王"}],"吃鱼":[{"addr":"1","hobby":"吃鱼","idCardNum":"a","name":"小王"},{"addr":"2","hobby":"吃鱼","idCardNum":"c","name":"老王"}],"吃肉":[{"addr":"2","hobby":"吃肉","idCardNum":"d","name":"王王"}]}
现在分成了三组
按组合条件分组:
package com.x.project.lambda; import com.alibaba.fastjson.JSON; import org.junit.Test; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; public class Group { @Test public void multiConditionGroup() { People a = new People(); a.setName("小王"); a.setIdCardNum("a"); a.setHobby("吃鱼"); a.setAddr("1"); People b = new People(); b.setName("大王"); b.setIdCardNum("b"); b.setHobby("吃鱼"); b.setAddr("1"); People c = new People(); c.setName("老王"); c.setIdCardNum("c"); c.setHobby("吃肉"); c.setAddr("2"); People d = new People(); d.setName("王王"); d.setIdCardNum("d"); d.setHobby("吃肉"); d.setAddr("2"); Map<People, List<People>> collect = Arrays.asList(a, b, c, d).stream().collect(Collectors.groupingBy(People::hobbyAddr)); System.out.println(JSON.toJSONString(collect)); } } class People { String name; String idCardNum; String phone; String bankCardNum; String hobby; String addr; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIdCardNum() { return idCardNum; } public void setIdCardNum(String idCardNum) { this.idCardNum = idCardNum; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getBankCardNum() { return bankCardNum; } public void setBankCardNum(String bankCardNum) { this.bankCardNum = bankCardNum; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } public People hobbyAddr(){ return new People(hobby,addr); } public People() { } public People(String hobby, String addr) { this.hobby = hobby; this.addr = addr; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof People)) return false; People people = (People) o; return Objects.equals(getHobby(), people.getHobby()) && Objects.equals(getAddr(), people.getAddr()); } @Override public int hashCode() { return Objects.hash(getHobby(), getAddr()); } }
如代码:需要添加一个关于相应条件的方法,另加关于相应条件的equals方法,
output:{{"addr":"2","hobby":"吃肉"}:[{"addr":"2","hobby":"吃肉","idCardNum":"c","name":"老王"},{"addr":"2","hobby":"吃肉","idCardNum":"d","name":"王王"}],{"addr":"1","hobby":"吃鱼"}:[{"addr":"1","hobby":"吃鱼","idCardNum":"a","name":"小王"},{"addr":"1","hobby":"吃鱼","idCardNum":"b","name":"大王"}]}