Java中stream流的常见用法
这篇文章主要是记录stream流的用法,因为stream流比较常用,并且一些操作较复杂,记录在此,以后参考。
1、filter用法
主要是用来过滤集合中的元素,较常用。
List<User> list = new ArrayList<>();list.add(new User(1, "小赵", "beijing"));list.add(new User(2, "小钱", "shanghai"));list.add(new User(3, "小孙", "tianjin"));list.add(new User(4, "小李", "nanjing"));list.add(new User(5, "小周", "shenzhen"));// 过滤出address=tianjin的List<User> list1 = list.stream().filter(item -> "tianjin".equals(item.getAddress())).collect(Collectors.toList());System.out.println(list1);
2、peek用法
主要是用来修改元素的状态,比如其中对象的字段等
List<User> list = new ArrayList<>();list.add(new User(1, "小赵", "beijing"));list.add(new User(2, "小钱", "shanghai"));list.add(new User(3, "小孙", "tianjin"));list.add(new User(4, "小李", "nanjing"));list.add(new User(5, "小周", "shenzhen"));// peek操作主要用于修改集合中的元素// 修改元素中的address为guangzhouList<User> list2 = list.stream().peek(item -> item.setAddress("guangzhou")).collect(Collectors.toList());System.out.println(list2);
3、map用法
主要是用来替换集合中的元素
List<User> list = new ArrayList<>();list.add(new User(1, "小赵", "beijing"));list.add(new User(2, "小钱", "shanghai"));list.add(new User(3, "小孙", "tianjin"));list.add(new User(4, "小李", "nanjing"));list.add(new User(5, "小周", "shenzhen"));// map操作主要是修改集合元素本身,也有一部分peek的功能// 将list的元素替换成元素的字段或者替换成其他的对象List<Integer> list3 = list.stream().map(User::getId).collect(Collectors.toList());System.out.println(list3);// map也可以用来peek的功能,比如下面例子,不过idea会提示用peek的List<User> list4 = list.stream().map(item -> {item.setAddress("beijing");return item;}).collect(Collectors.toList());System.out.println(list4);
4、flatmap用法
主要是将集合中的元素换成stream流
List<String> list1 = Arrays.asList("a", "b");List<String> list2 = Arrays.asList("1", "2", "3");// flatmap主要是将集合中的元素换成stream流List<String> list3 = list1.stream().flatMap(item -> list2.stream().map(i -> item + i)).collect(Collectors.toList());// 将list1和list2中的元素拼接成list3// [a1, a2, a3, b1, b2, b3]System.out.println(list3);
5、list转map用法
这种场景是用于根据对象已知字段查找集合中对应元素
List<User> list = new ArrayList<>();list.add(new User(1, "小赵", "beijing"));list.add(new User(2, "小钱", "shanghai"));list.add(new User(3, "小孙", "tianjin"));list.add(new User(4, "小李", "nanjing"));list.add(new User(5, "小周", "shenzhen"));// 将list转成map// 一般这种场景是用于根据对象已知字段查找集合中对应元素// 这种一般用于key是唯一的,不然异常,或者用下一种Map<Integer, User> map = list.stream().collect(Collectors.toMap(User::getId, Function.identity()));Map<Integer, User> map1 = list.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key2));
6、分组用法
这种一般用于按照元素的字段等条件进行分组
List<User> list = new ArrayList<>();list.add(new User(1, "小赵", "beijing"));list.add(new User(2, "小钱", "shanghai"));list.add(new User(3, "小孙", "tianjin"));list.add(new User(4, "小李", "nanjing"));list.add(new User(5, "小周", "shenzhen"));Map<Integer, List<User>> map = list.stream().collect(Collectors.groupingBy(User::getId));