Lambda 在 jdk1.8
外面曾经很好用了,在这里不讲底层的实现,只有简略的用法,会持续补全。
首先一个 list 咱们要应用 lambda
的话,须要应用它的 stream()
办法,获取流,能力应用后续的办法。
根底类 User.java
public class User {
public long userId;
public User() {}
public User(long userId, String name, int age) {
this.userId = userId;
this.name = name;
this.age = age;
}
public String name;
public int age;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
public long getUserId() {return userId;}
public void setUserId(long userId) {this.userId = userId;}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", userId=" + userId +
'}';
}
public void output() {
System.out.println("User{" +
"name='" + name + '\'' +
", age=" + age +
", userId=" + userId +
'}');
}
}
1. 遍历元素
应用 foreach 办法,其中 s->
外面的 s 指 list 外面的每一个元素,针对每一个元素都执行后续的办法。如果外面只有一句话,能够间接缩写 foreach(n -> System.out.println(n));
,如果须要执行的办法外面有两句或者多句须要执行的话,须要能够应用list.stream().forEach(s -> {System.out.println(s);});
模式。
// 遍历 list(String)和对象
public static void foreachListString() {
List features = Arrays.asList("Lambdas", "Default Method", "Stream API",
"Date and Time API");
features.forEach(n -> System.out.println(n));
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// s 代表的是外面的每一个元素,{}外面就是每个元素执行的办法,这个比拟容易了解
list.stream().forEach(s -> {System.out.println(s);
});
// 解决对象
List<User> users = new ArrayList<>();
User user1 = new User();
user1.setAge(1);
user1.setName("user1");
user1.setUserId(1);
users.add(user1);
users.stream().forEach(s -> s.output());
}
2. 转化外面的每一个元素
map 是须要返回值的,s 代表外面的每一个元素,return 解决后的返回值
public static void mapList() {List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List<String> list2 = new ArrayList<>();
// map 代表从一个转成另一个,s 代表外面的每一个值,{}代表针对每一个值的解决办法,如果是代码句子,则须要有返回值
// 返回值代表转化后的值,以下两种都能够
list2 = list.stream().map(s -> {return s.toUpperCase();
}).collect(Collectors.toList());
list2.stream().forEach(s -> {System.out.println(s);
});
list2 = list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
list2.stream().forEach(s -> {System.out.println(s);
});
}
3. 条件过滤筛选
应用 filter 函数,外面的表达式也是须要返回值的,返回值应该为 boolean 类型,也就是符合条件的就保留在 list 外面,不符合条件的就被过滤掉。
// filter 过滤
public static void filterList() {List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
list1.add("aasd");
list1.add("agdfs");
list1.add("bdfh");
list2 = list1.stream().filter(s -> {return s.contains("a");
}).collect(Collectors.toList());
list2.stream().forEach(s -> {System.out.println(s);
});
}
4. 取出 list 外面的对象中的元素,返回一个特定的 list
这个能够让咱们取出 list 汇合中的某一个元素,也是应用 map 即可。
// list 汇合中取出某一属性
public static void getAttributeList() {List<User> list = new ArrayList<>();
User user1 = new User();
user1.setUserId(1);
user1.setName("James");
user1.setAge(13);
list.add(user1);
User user2 = new User();
user2.setUserId(2);
user2.setName("Tom");
user2.setAge(21);
list.add(user2);
// 两种书写形式都能够,一个是 map 外面,应用每一个实例调用 User 类的 getName 办法返回值就是转化后的值。List<String> tableNames = list.stream().map(User::getName).collect(Collectors.toList());
tableNames.stream().forEach(s -> {System.out.println(s);
});
List<String> tableNames1 = list.stream().map(u -> u.getName()).collect(Collectors.toList());
tableNames1.stream().forEach(s -> {System.out.println(s);
});
}
5. 分组
能够依据某一个属性来分组,取得map
// 分组, 每一组都是 list
public static void groupBy() {List<User> userList = new ArrayList<>();// 寄存 user 对象汇合
User user1 = new User(1, "张三", 24);
User user2 = new User(2, "李四", 27);
User user3 = new User(3, "王五", 21);
User user4 = new User(4, "张三", 22);
User user5 = new User(5, "李四", 20);
User user6 = new User(6, "王五", 28);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
// 依据 name 来将 userList 分组
Map<String, List<User>> groupBy = userList.stream().collect(Collectors.groupingBy(User::getName));
System.out.println(groupBy);
}
6. 对某一个属性进行求和
比方咱们须要对年龄进行求和,能够应用 mapToInt(),外面参数应该应用 类名:办法名
,最初须要应用 sum() 来求和。
public static void getSum(){List<User> userList = new ArrayList<>();// 寄存 user 对象汇合
User user1 = new User(1, "qw", 24);
User user2 = new User(2, "qwe", 27);
User user3 = new User(3, "aasf", 21);
User user4 = new User(4, "fa", 22);
User user5 = new User(5, "sd", 20);
User user6 = new User(6, "yr", 28);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
// sum()办法,则是对每一个元素进行加和计算
int totalAge = userList.stream().mapToInt(User::getAge).sum();
System.out.println("和:" + totalAge);
}
7. 将 list 转化成 map
比方咱们须要 list 外面的对象的 id 和这个对象对应,那就是须要转换成 map。须要在 collect()办法外面应用 Collectors 的 toMap()办法即可,参数就是 key 和 value。
public static void listToMap(){List<User> userList = new ArrayList<>();
User user1 = new User(1, "12", 22);
User user2 = new User(2, "21", 17);
User user3 = new User(3, "a", 11);
User user4 = new User(4, "a", 22);
User user5 = new User(5, "af", 22);
User user6 = new User(6, "fa", 25);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
Map<Long,User> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, user -> user));
System.out.println("toMap:" + userMap.toString());
}
此文章仅代表本人(本菜鸟)学习积攒记录,或者学习笔记,如有侵权,请分割作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有谬误之处,还望指出,感激不尽~
技术之路不在一时,山高水长,纵使迟缓,驰而不息。
公众号:秦怀杂货店