javastring Java-Stream流方法学习及总结
1 前言
Stream是一个来自数据源的元素队列并支持聚合操作,其中具有以下特性:
本文总结了部分在日常开发中经常接触到的一些Stream流相关的方法,不足之处或有错误欢迎留评,总结的几个方法如下:
2 forEach()
forEach()源码:
void forEach(Consumer<!--? super T--> action);Stream().forEach() : 迭代流中的数据
forEach() 的返回类型为void,不会产生新的流
举个栗子:
public void testForEach() {/*** 使用forEach()内部迭代* ints()表示整数类型* limit()表示限制流个数(次数)*/Random random = new Random();random.ints().limit(10).forEach(System.out::println);}运行结果:

文章插图
再举个灵活一点的栗子:
public void testForEach() {/*** 使用forEach()转换集合类型,如List->Map*/AtomicInteger i = new AtomicInteger();//原子类型Map<Integer,String> map = new HashMap<>();List<String> list = new ArrayList<>(Arrays.asList("Hello",",","world"));list.stream().forEach(s->{map.put(i.getAndIncrement(),s);});}对于forEach()方法在本人日常开发中常用于:
- 使用内循环对集合进行遍历
- 使用foreach方法将List转为Map形式
3 map()
map()源码:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);Stream().map() 用于映射每个元素到对应的结果返回类型为Stream,map()会产生新的流并返回
举个栗子:
public void testMap(){/*** map()获取list每个元素的平方值* distinct()去重操作* collect()将map()产生的新的流转为List类型*/List<Integer> list = Arrays.asList(1,2,3);list.stream().map(num -> num * num).distinct().collect(Collectors.toList()).forEach(System.out::println);}4 filter()
filter()源码:
Stream<T> filter(Predicate<? super T> predicate);Stream().filter()为条件过滤器举个栗子:
public void testFilter(){/*** filter()过滤空字符串* count()统计符合条件的个数,返回类型long*/List<String> list = new ArrayList<>(Arrays.asList("ab","","abc","","acd"));long count = list.stream().filter(str -> str.isEmpty()).count();}5 sorted()
sorted()源码:
Stream<T> sorted();Stream<T> sorted(Comparator<? super T> comparator);Stream支持两种方式的排序:- 无参方法默认为自然排序
- sorted(Comparator comp) 按自定义比较器进行排序
仍然是举个栗子:
1)无参方法
public void testSorted(){/*** sort()无参默认为自然排序* 返回类型Stream 会产生新的流*/List<String> list = new ArrayList<>(Arrays.asList("aaa","ccc","bbb"));list.stream().sorted().forEach(System.out::println);}执行结果:
文章插图
2)带参方法(User类由name和age组成)
- 先比较年龄,按从小到大排序
- 若年龄相等,则按性名自然排序
public void testSorted(){/*** sort(Comparator comp)按自定义比较器进行排序* 返回类型同样是Stream 会产生新的流*/List<User> userList = new ArrayList<>(Arrays.asList(new User("zhangsan",22),new User("wangwu",22),new User("badao",32),new User("kongfu",16)));Stream<User> sorted = userList.stream().sorted((x, y) -> {if (x.getAge() == y.getAge()) { // 使用流中的序列两两进行比较return x.getName().compareTo(y.getName());} else {return x.getAge() - y.getAge();//顺序// y.getAge() - x.getAge() 为逆序}});sorted.forEach(System.out::println);}执行结果:
文章插图
6 collect()
collect()源码:
<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner);stream().collect() 由三个参数构成 :- Supplier 生产者,返回最终结果
- BiConsumer<R, ? super T> accumulator,累加器 :
其中 R 为要返回的集合,? super T 为遍历过程中的每个参数,相当于add操作 - BiConsumer<R,R> combiner,合并器 :
有并行流时才会使用,相当于将第二部操作形成的list添加到最终的list,addAll操作
举个栗子:1)new()
public void testCollect(){Stream<String> stream = Stream.of("hello","world","hello,world");// new()List<String> list = stream.collect(Collectors.toList());//List// 指定集合类型,如ArrayListArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));//Setstream.collect(Collectors.toSet());// 指定HashSetHashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));// 拼接字符串String str = stream.collect(Collectors.joining());2)new() -> add() -> addAll()
public void testCollect(){/*** 参数传递行为相当于: new() -> add() -> addAll()*/Stream<String> stream = Stream.of("hello","world","hello,world");// new() -> add() -> addAll()完整演示HashMap<String,String> map = stream.collect(HashMap::new,(x,y)->{x.put(y,y); // x 为集合,y 为当前遍历元素,以当前遍历元素作为kv},HashMap::putAll);map.forEach((x,y)->{System.out.println(x+" : "+y);});执行结果:
文章插图
- 提高电脑流畅度,windows性能调优
- 秋季预防流感的四大误区
- 去医院开健康证明需要什么 去医院开健康证明流程
- 夏天宝宝流鼻血咋办
- 为发烧而生,红米K30S至尊纪念版,带来更流畅的使用体验
- 烽火流金为什么不播 烽火流金审核为什么没通过
- 烽火流金免费观看全大概几号播
- 烽火流金上星剧 腾讯定制剧烽火流金
- 慈文 烽火流金 慈文经纪烽火流金
- 烽火流金几月几日播
