把项目中用常用的lambda表达式总结归纳一下
Lambda
遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 遍历list
List list = Arrays.asList("hello","wd", "123", "nihao");
list.forEach(item -> {
System.out.println(item);
});
// 遍历map
Map map = new HashMap<>();
map.put("key1","value1");
map.put("key2", 1234);
map.forEach((k,v) -> {
System.out.println(k);
System.out.println(v);
});
Stream流的操作
流的操作可以归结为几种:
1、遍历操作(map)
使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合。
例如:
遍历转换为大写
1
2
3// 将所有的的英文字母大写
List list = Arrays.asList("hello","wd", "123", "nihao");
list.stream().map(String::toUpperCase).forEach(System.out::println);
平方数
1
2List list = Arrays.asList(1,2,3,4,5,6,7,8);
list.stream().map((x) -> x*x).forEach(System.out::println);
2、 过滤操作(filter)
使用filter可以对象Stream中进行过滤,通过测试的元素将会留下来生成一个新的Stream。
例如:
得到不为空的String
1
2List list = Arrays.asList("a","","c","d");
list.stream().filter(s -> !s.isEmpty()).forEach(System.out::println);
留下长度小于3的值
1
2List list = Arrays.asList("hello","wd", "123");
list.stream().filter(s -> s.length() < 3).forEach(System.out::println);
3、循环操作(forEach)
如果只是想对流中的每个对象进行一些自定义的操作,可以使用forEach:
例如:
循环输出list里面的数据
1
2List list = Arrays.asList("hello","wd", "123");
list.forEach(System.out::println);
4、返回特定的结果集(limit/skip)
limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素
例如:
1
2
3List list = Arrays.asList("a","b","c","d","e","f");
List newList = list.stream().skip(2).limit(3).collect(Collectors.toList())
newList.forEach(System.out::println);
注意skip与limit是有顺序关系的,比如使用skip(2)会跳过集合的前两个,返回的为c、d、e、f,然后调用limit(3)会返回前3个,所以最后返回的c,d,e
5、排序(sort/min/max/distinct)
sort可以对集合中的所有元素进行排序。max,min可以寻找出流中最大或者最小的元素,而distinct可以寻找出不重复的元素
例如:
对一个集合进行排序
1
2
3
4
5
6// 默认排序
List list = Arrays.asList("l","d","b","u","e","c");
list.stream().sorted().forEach(System.out::println);
// 按长度排序
List sortList = Arrays.asList("1234","12345","123","123456","1","12");
sortList.stream().sorted((s1, s2) -> s1.length() - s2.length()).forEach(System.out::println);
得到其中最大长度的元素
1
2
3List list = Arrays.asList("1234","12345","123","123456","1","12");
String max = list.stream().max((s1, s2) -> s1.compareTo(s2)).get();
System.out.println(max);
对一个集合进行去重
1
2List list = Arrays.asList("a","a","b","c","d","d");
list.stream().distinct().forEach(System.out::println);
其中的distinct()方法能找出stream中元素equal(),即相同的元素,并将相同的去除,上述返回即为a,b,c,d。
6、匹配(Match)
有的时候,我们只需要判断集合中是否全部满足条件,或者判断集合中是否有满足条件的元素,这时候就可以使用match方法
allMatch:Stream 中全部元素符合传入的 predicate,返回 true
anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true
例如:
判断集合中有没有为’c’的元素
1
2
3
4List list = Arrays.asList("a","a","b","c","d","d");
// anyMatch中只要有一个元素符合,则返回true
boolean result = list.stream().distinct().anyMatch(s -> s.equals("c"));
System.out.println("c是否存在:"+result);
判断集合中是否全不为空
1
2
3List list = Arrays.asList("a","","b","c","d","d");
boolean result = list.stream().noneMatch(s -> s.isEmpty());
System.out.println("集合中的元素全部不为空:" + result);
三、实战
User.java
1
2
3
4
5
6
7
8
9
10
11
12public class User{
/** 用户id */
private Integer id;
/** 用户名 */
private String name;
/** 年龄 */
private Integer age;
/** 性别 */
private String sex;
// 省略get set方法
}
初始化数据
1
2
3
4
5List userList = new ArrayList<>();
userList.add(new User(1, "路人甲", 18, "男"));
userList.add(new User(2, "路人乙", 24, "女"));
userList.add(new User(3, "路人丙", 20, "男"));
userList.add(new User(4, "路人丁", 21, "女"));
1、获取所有用户id,并返回一个list
1List ids = userList.stream().map(User::getId).collect(Collectors.toList())
2、 获取所有用户名,逗号隔开
1String names = userList.stream().map(User::getName).collect(Collectors.joining(","));
3、年龄排序
1
2
3
4// 升序
List sortUserList = userList.stream().sorted((s1, s2) -> s1.getAge() -s2.getAge()).collect(Collectors.toList());
// 降序
List sortUserList = userList.stream().sorted((s1, s2) -> s2.getAge() -s1.getAge()).collect(Collectors.toList());
4、年龄大于20岁的人的集合
1List users = userList.stream().filter(e -> e.getAge() > 20).collect(Collectors.toList());
5、年龄小于20岁的人有多少个
1long count = userList.stream().filter(e -> e.getAge() < 20).count();
6、性别分组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30Map> groupUserMap = userList.stream().collect(Collectors.groupingBy(User::getSex));
// 返回结果
{
"女": [
{
"id": 2,
"name":"路人乙",
"age":24,
"sex":"女"
},{
"id": 4,
"name":"路人丁",
"age":21,
"sex":"女"
}
],
"男": [
{
"id": 1,
"name":"路人甲",
"age":18,
"sex":"男"
},{
"id": 3,
"name":"路人丙",
"age":20,
"sex":"男"
}
]
}
最后感谢一下”路人甲,路人乙,路人丙,路人丁”等四人的友情出演。
参考