lambda stream 循环_Java8中Stream和Lambda的用法

把项目中用常用的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":"男"

}

]

}

最后感谢一下”路人甲,路人乙,路人丙,路人丁”等四人的友情出演。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值