一、简单说一下JDK 1.8 Lambda
JDK1.8概述:JDK1.8,又称之为Java 8(我习惯叫它为JDK1.8,后续统一叫做JDK1.8),是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布,它支持函数式编程,新的JavaScript引擎,新的日期API,新的Stream API等。
JDK1.8相比1.7之前版本,有以下几方面的优化:
- Lambda表达式
- 函数式接口
- 方法引用和构造器调用
- Stream API
- 接口中的默认方法和静态方法
- 新时间日期API
二、言归正传,上干货
1. 准备数据
先准备一个list,list中是一个个map对象,包含学生的编号(no)、姓名(name)、班级(class)
static List<Map<String, Object>> list = new ArrayList<>();
static {
list.add(new HashMap() {{
put("no", 4);
put("name", "小米");
put("class", "二班");
}});
list.add(new HashMap() {{
put("no", 3);
put("name", "小红");
put("class", "一班");
}});
list.add(new HashMap() {{
put("no", 2);
put("name", "小丽");
put("class", "二班");
}});
list.add(new HashMap() {{
put("no", 1);
put("name", "小明");
put("class", "一班");
}});
}
2. 按照班级(class)分组简单分组
public static void group() {
Map<String, List<Map<String, Object>>> classMap = list.stream().collect(Collectors.groupingBy(m -> m.get("class").toString()));
//打印结果验证
for (Map.Entry<String, List<Map<String, Object>>> item : classMap.entrySet()) {
String key = item.getKey();
System.err.println("班级:" + key);
List<Map<String, Object>> list0 = item.getValue();
for (Map<String, Object> map : list0) {
System.err.println(Jsons.toJSONString(map));
}
}
System.err.println("=====================================================");
}
3. 按照编号(no)正序排序
public static void order() {
List<Map<String, Object>> list = Test.list.stream().sorted((m1, m2) -> {
return m1.get("no").toString().compareTo(m2.get("no").toString());
}).collect(Collectors.toList());
//打印结果验证
for (Map<String, Object> map : list) {
System.err.println(Jsons.toJSONString(map));
}
System.err.println("=====================================================");
}
3. 按照班级分组,并组内按照编号(no)正序排序
public static void groupOrder() {
Map<String, List<Map<String, Object>>> classMap = list.stream().sorted((m1, m2) -> {
return m1.get("no").toString().compareTo(m2.get("no").toString());
}).collect(Collectors.groupingBy(m -> m.get("class").toString()));
//打印结果验证
for (Map.Entry<String, List<Map<String, Object>>> item : classMap.entrySet()) {
String key = item.getKey();
System.err.println("班级:" + key);
List<Map<String, Object>> list0 = item.getValue();
for (Map<String, Object> map : list0) {
System.err.println(Jsons.toJSONString(map));
}
}
System.err.println("=====================================================");
}
4. 按照班级(class)分组倒序,并组内按编号(no)倒序
public static void reverseGroupOrder() {
LinkedHashMap<String, List<Map<String, Object>>> classMap = list.stream().sorted((m1, m2) -> {
int v1 = m2.get("class").toString().compareTo(m1.get("class").toString());
if (v1 != 0)
return v1;
int v2 = m2.get("no").toString().compareTo(m1.get("no").toString());
return v2;
}).collect(Collectors.groupingBy(m -> m.get("class").toString(), LinkedHashMap::new, Collectors.toCollection(ArrayList::new)));
//打印结果验证
for (Map.Entry<String, List<Map<String, Object>>> item : classMap.entrySet()) {
String key = item.getKey();
System.err.println("班级:" + key);
List<Map<String, Object>> list0 = item.getValue();
for (Map<String, Object> map : list0) {
System.err.println(Jsons.toJSONString(map));
}
}
System.err.println("=====================================================");
}