使用Stream常常可以避免一些for循环造成的代码臃肿。在实际开发中,遇到可以用Stream处理的场景也越来越多,源码还未参透。在这只总结一些常用到的方法。
Stream的常用方法
常用方法用到的集合:
List<Integer> integers = new ArrayList<>();
integers.add(3);
integers.add(1);
integers.add(1);
integers.add(2);
integers.add(4);
integers.add(5);
forEach()
遍历集合中的每一个元素,括号里面可以队元素进行处理。
filter()
filter用于过滤,括号里面一般使用lambda表达式设置过滤条件。
//过滤掉list中大于等于4的元素,::为语法糖。System.out::println与integer-> System.out.println(integer)等价
integers.stream().filter(integer -> integer<4).forEach(System.out::println);
distinct()
distinct用于去重。
//取出list中重复的元素
integers.stream().distinct().forEach(System.out::println);
skip()
skip用于跳过前面元素,括号里面写具体跳过元素的数字
//跳过前三个元素
integers.stream().skip(3).forEach(System.out::println);
limit()
limit用于统计前面元素,括号里面写具体统计元素的数字
//取出前三个元素
integers.stream().limit(3).forEach(System.out::println);
sorted()
sorted 方法用于排序。
//对集合中的元素进行排序
integers.stream().sorted().forEach(System.out::println);
count()
count方法用于获取集合中的元素个数
//集合元素的个数
System.out.println(integers.stream().count());
map()
map用于处理集合值,一般传入该集合,然后对该集合做处理。
//将集合中的元素都变为以前的二次方
integers.stream().map(integer -> integer*integer).forEach(System.out::println);
Stream中的collect()
collect用于集合的转化,一般放在末尾,将集合的数据处理完成之后,我们需要将处理后的数据装到什么集合中就在collect的括号里调用Collectors的方法。常用的Collectors方法有toList、toSet、toMap、groupingBy、mapping等方法。比如想要将List存储的对象中的一个或者多个字段提取出来,或者想要将一个集合中的某个属性对应的数据的集合提出出来。collect来实现,具体用法参考下面实例:
ArrayList<Item> items = new ArrayList<>();
items.add(new Item("tcc1",1));
items.add(new Item("tcc2",2));
items.add(new Item("tcc3",3));
items.add(new Item("tcc4",4));
items.add(new Item("tcc5",1));
//取出items中name元素,并存入set集合Item::getName等价于item->item.getName()
Set<String> groupCodes = items.stream().map(Item::getName).collect(Collectors.toSet());
System.out.println(groupCodes);
//取出items中name和age分别作为key和value,放入map
Map<String, Integer> map = items.stream().collect(Collectors.toMap(Item::getName, Item::getAge));
System.out.println(map);
//将集合以年龄排序,返回年龄 和 年龄对应的集合的map
Map<Integer, List<Item>> collect = items.stream().collect(Collectors.groupingBy(Item::getAge));
System.out.println(collect);
//将集合以年龄排序,返回年龄和 年龄中对应集合中的name集合的map
Map<Integer, Set<String>> collect1 = items.stream().collect(
Collectors.groupingBy(Item::getAge,
Collectors.mapping(Item::getName, Collectors.toSet())));
System.out.println(collect1);