stream接口的各个实例
说明
Stream接口定义了一系列集合操作的高阶函数的抽象方法,Collection接口中的stream方法和parallelStream获取其实例,而集合类直接或间接地实现了Collection接口,从而支持这些高阶函数。
区别在于,stream返回的是一个普通流,parallelStream返回的是一个并行流,后者在一定程度上能在并行下提升性能,但如果使用场景不当,则会降低性能。
1.filter过滤
按条件进行过滤,返回过滤后的流。
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
//filter 根据条件过滤返回值
List<String> list1 = list.stream().filter(s-> {return Integer.valueOf(s)<3;}).collect(Collectors.toList());```
2.map
传入一个映射函数,将旧的流中的每一个元素转换为新的元素,返回新的流。
List<String> list2 = list.stream().map(s->{
return s+s;}).collect(Collectors.toList());
3.mapToInt
传入一个映射函数,将旧的流中的每一个元素转换为整型,返回整型流(mapToLong同理)
Map<String,Integer> map = new HashMap<>();
map.put("abc", 1);
List<Map<String,Integer>> listMap = new ArrayList<>();
listMap.add(map);
OptionalInt list3 = listMap.stream().mapToInt(o->{return o.get("abc");}).max();
4.flatMap
如果旧的流中的元素本身也是集合,相当于原始数据是二维集合,该方法把旧的流中的每一个元素集合中的子元素,转换为新的元素,最后全部汇总为一个新的流,即:将二维集合映射为一维集合。
String[] strs = {"hello","world"};
List<String> listStr = Arrays.asList(strs).stream().map(s->s.split("")).flatMap(s->Arrays.stream(s)).collect(Collectors.toList());
5.distinct
去除重复元素,内部实现是通过元素的equals方法,返回新的流
List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list = list.stream().distinct().collect(Collectors.toList());
6.sorted
传入一个比较器,对元素进行排序,返回新的流。
1.自然排序
list.stream().sorted()
2.自然逆序
list.stream().sorted(Comparator.reverseOrder())
3.使用Comparator 来排序一个list
list.stream().sorted(Comparator.comparing(Student::getAge))
4.把上面的元素逆序
list.stream().sorted(Comparator.comparing(Student::getAge).reversed())
7.peek
遍历每一个元素,进行操作,并返回流
和forEach的区别在于,forEach是一个终端方法,无返回值,所以不能接着调用其他方法,而peek为中间操作。按照Java团队的说法&