Stream流

stream流与IO流没有任何关系,stream流类似车间的生产线,对数据进行加工,不存储数据

获取Stream流的两种方式

public class StreamIntro {public static void main(String[] args) {// 方式一: 通过Collection接口的stream()方法获取流List<String> arrayList = new ArrayList<>();Stream<String> stream = arrayList.stream();Set<String> set = new HashSet<>();Stream<String> stream1 = set.stream();Map<String, String> map = new HashMap<>();Stream<String> stream2 = map.keySet().stream();Stream<String> stream3 = map.values().stream();Stream<Map.Entry<String, String>> stream4 = map.entrySet().stream();// 方式二: 通过Stream接口中的静态方法of获取流Stream<String> stream5 = Stream.of("zdy", "zyz", "cyx", "mcs");String[] strs = {"zdy", "zyz", "cyx", "mcs"};Stream<String> stream6 = Stream.of(strs);}
}

Stream常用方法

stream常用方法分为两类

终结方法:返回值不是Stream流类型的方法,不再支持链式调用,例如:count、forEach

非终结方法:返回值是Stream流类型的方法,支持链式调用,例如:filter、limit、map、skip

forEach方法

遍历集合中的每一个元素

public class StreamIntro {public static void main(String[] args) {Stream<String> stream = Stream.of("zdy", "zyz", "cyx", "mcs");stream.forEach(System.out::println); // 打印 "zdy"  "zyz"  "cyx"  "mcs"}
}

count方法

计算集合的长度

public class StreamIntro {public static void main(String[] args) {Stream<String> stream = Stream.of("zdy", "zyz", "cyx", "mcs");long count = stream.count();System.out.println(count); // 打印 4}
}

filter方法

自定义编写过滤规则,通过规则的数据留下,支持链式调用

public class StreamIntro {public static void main(String[] args) {Stream<String> stream = Stream.of("zdy", "zyz", "cyx", "mcs");stream.filter(s -> s.contains("z")) // 包含"z"的留下.filter(s -> s.contains("y")) // 包含"y"的留下.forEach(System.out::println); // 打印 "zdy" "zyz"}
}

limit方法

取集合中的前n个数据

public class StreamIntro {public static void main(String[] args) {Stream<String> stream = Stream.of("zdy", "zyz", "cyx", "mcs");stream.limit(2).forEach(System.out::println); // 打印 "zdy" "zyz"}
}

skip方法

从第几条数据开始取

public class StreamIntro {public static void main(String[] args) {Stream<String> stream = Stream.of("zdy", "zyz", "cyx", "mcs");stream.skip(2).forEach(System.out::println); // 打印 "cyx" "mcs"}
}

map方法

将一种类型的流转换为另一种类型的流

public class StreamIntro {public static void main(String[] args) {// 通过map 将Stream<String>类型转换为Stream<Integer>类型Stream<String> stream = Stream.of("1", "2", "3", "4");Stream<Integer> stream1 = stream.map(Integer::parseInt);}
}

sorted方法

排序方法,支持自定义比较器

public class StreamIntro {public static void main(String[] args) {Stream<Integer> stream = Stream.of(5, 2, 7, 4);stream.sorted((num1, num2) -> num1 - num2).forEach(System.out::println); // 打印 2 4 5 7}
}

distinct方法

去重方法

public class StreamIntro {public static void main(String[] args) {Stream<String> stream = Stream.of("zdy", "zdy", "zyz", "zyz", "cyx", "mcs");stream.distinct().forEach(System.out::println); // 打印 "zdy" "zyz" "cyx" "mcs"}
}

match方法

匹配方法,细分为三个,allMatch所有数据都满足条件,anyMatch任意一条数据满足条件,noneMatch没有数据满足条件,都返回boolean类型

public class StreamIntro {public static void main(String[] args) {Stream<Integer> stream = Stream.of(5, 2, 7, 4);boolean match = stream.allMatch(num -> num > 4); // 所有数据都>4吗System.out.println(match); // 打印 "false"Stream<Integer> stream2 = Stream.of(5, 2, 7, 4);boolean anyMatch = stream2.anyMatch(num -> num > 4); // 有数据>4吗System.out.println(anyMatch); // 打印 "true"Stream<Integer> stream3 = Stream.of(5, 2, 7, 4);boolean noneMatch = stream3.noneMatch(num -> num == 3); // 没有数据=3吗System.out.println(noneMatch); // 打印 "true"}
}

max方法

获取最大值,支持自定义比较器,通过比较器也可以实现min的功能

public class StreamIntro {public static void main(String[] args) {Stream<Integer> stream = Stream.of(5, 2, 7, 4);Optional<Integer> max = stream.max((num1, num2) -> num1 - num2);System.out.println(max.get()); // 打印 "7"}
}

min方法

获取最小值,支持自定义比较器,通过比较器也可以实现max的功能

public class StreamIntro {public static void main(String[] args) {Stream<Integer> stream = Stream.of(5, 2, 7, 4);Optional<Integer> min = stream.min((num1, num2) -> num1 - num2);System.out.println(min.get()); // 打印 "2"}
}

reduce方法

将所有的数据归纳为一个数据

public class StreamIntro {public static void main(String[] args) {Stream<Integer> stream = Stream.of(5, 2, 7, 4);// 参数1 默认值 参数2 数据处理方式 以下代码可以理解为 reduce=默认值-5-2-7-4Integer reduce = stream.reduce(0, (num1, num2) -> num1 - num2);System.out.println(reduce); // -18}
}

concat方法

合并两个流

public class StreamIntro {public static void main(String[] args) {Stream<String> stream1 = Stream.of("zdy", "zyz", "cyx", "mcs");Stream<Integer> stream2 = Stream.of(5, 2, 7, 4);Stream<? extends Serializable> stream = Stream.concat(stream1, stream2);stream.forEach(System.out::println); // 打印 "zdy" "zyz" "cyx" "mcs" 5 2 7 4}
}

收集Stream流中的结果

Stream流结果保存到集合中

public class StreamIntro {public static void main(String[] args) {Stream<String> stream1 = Stream.of("zdy", "zyz", "cyx", "mcs");// 保存到Set中Set<String> collect = stream1.collect(Collectors.toSet());// 保存到List中List<String> collect1 = stream1.collect(Collectors.toList());// 保存到ArrayListArrayList<String> collect2 = stream1.collect(Collectors.toCollection(ArrayList::new));// 保存到ArraySetHashSet<String> collect3 = stream1.collect(Collectors.toCollection(HashSet::new));}
}

Stream流结果保存到数组中

public class StreamIntro {public static void main(String[] args) {Stream<String> stream1 = Stream.of("zdy", "zyz", "cyx", "mcs");// 保存成数组String[] strings = stream1.toArray(String[]::new);}
}

Collectors.maxBy/minBy/summarizingInt

对流中数据进行聚合计算

public class StreamIntro {public static void main(String[] args) {Stream<String> stream1 = Stream.of("zdy", "zyz", "cyx", "mcs");Stream<Person> stream = Stream.of(new Person("zdy", 23),new Person("zyz", 24),new Person("cyx", 25),new Person("mcs", 26));// maxBy 获取年龄最大值 minBy 获取最小值Optional<Person> collect = stream.collect(Collectors.maxBy((p1, p2) -> p1.getAge() - p2.getAge()));System.out.println(collect.get());Stream<Person> stream2 = Stream.of(new Person("zdy", 23),new Person("zyz", 24),new Person("cyx", 25),new Person("mcs", 26));// summingInt 求年龄总和IntSummaryStatistics collect1 = stream2.collect(Collectors.summarizingInt(Person::getAge));// 年龄总和System.out.println(collect1.getSum());// 年龄平均值System.out.println(collect1.getAverage());// 统计数量System.out.println(collect1.getCount());}
}

Collectors.groupingBy

对流中数据进行分组 多级分组

public class StreamIntro {public static void main(String[] args) {Stream<Person> stream2 = Stream.of(new Person("zdy", 23),new Person("zyz", 24),new Person("cyx", 23),new Person("mcs", 24));// 通过age进行分组 23一组 24一组Map<Integer, List<Person>> collect = stream2.collect(Collectors.groupingBy(Person::getAge));collect.forEach((k, v) -> {System.out.println(k + " " + v);// 打印 												

Java JDK 1.8 新特性 Stream流相关推荐

  1. java的collect用法_java8新特性:stream流中collect用法

    java8新特性:stream流中collect用法 java8新特性:stream流中collect用法 1.toList List collectList = Stream.of(1, 2, 3, ...

  2. Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例

    Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例 目录 文章目录 1.count:计数-终结方法 2.limit:取前几个元素-延迟方法 3.skip: ...

  3. Java复习第11天---11.3---Java8新特性---Stream流特点和常用方法2

    Java复习第11天---11.3---Java8新特性---Stream流特点和常用方法2 目录 文章目录 1.Stream流特点 2.filter:过滤 3.map:映射 ***后记*** : 内 ...

  4. Java复习第11天---11.2---Java8新特性---Stream流获取方式和常用方法1

    Java复习第11天---11.2---Java8新特性---Stream流获取方式和常用方法1 目录 文章目录 1.Stream流的2中获取方式 1.1.集合的stream方法 1.2.Stream ...

  5. Java8新特性Stream流详解

    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...

  6. Java8新特性——Stream流:不同于IO流的流,操作集合数据

    文章目录 Stream流 1.认识Stream流(源码说明) 1.1.Stream流和Collection的区别 1.2.流的获取方式 1.3.流操作和管道 1.4.并行性 1.5.不干扰内政 1.6 ...

  7. stream流_最详细的JDK8新特性————Stream流

    Stream流 在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊 端. 传统集合的多步遍历代码: 几乎所有的集合(如Collect ...

  8. java8新特性stream流

    参考自深蓝至尊的Java8 新特性之流式数据处理 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式 ...

  9. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

最新文章

  1. 关于编程的浅学习与深学习
  2. 【linux】【tcpdump】linux之tcpdump抓包及wireshark分析详解
  3. 【互联网大会】微信小程序斩获大奖 马化腾谈小程序开发生态
  4. gamebryo坐标系
  5. CommonJS模块的循环加载
  6. 网络七层协议_IT人计算机网络浅析
  7. 基于TI AM335x创龙开发板的快速体验
  8. linux临时网络配置
  9. loadrunner中定义数组
  10. sqlite如何与mysql连接数据库连接_c#中怎么连接到sqlite数据库?
  11. D触发器的工作原理以及Verilog代码(一/二)
  12. python大神年薪_我程序员年薪 80 万被亲戚鄙视不如在二本教书的博士生?
  13. 运算放大器单电源设计
  14. 主要计算机网络设备及其主要用途
  15. 关于mysql的时区(下):如何设置mysql的时区
  16. MA Chapter 3 Presenting information(SRCharlotte)
  17. 最小均方算法二分类(基于双月数据集)
  18. 我的世界服务器防挂机系统指令,我的世界反作弊和防飞行指令分享
  19. ZedBoard教程PL篇(2):按键检测
  20. STM32实现DAC功能输出音频波形

热门文章

  1. 一个批量生成联系人数据(vcf)的小工具
  2. iPhone“点击支付”新功能上热搜:比支付宝还方便?
  3. 《仓库管理系统》主要功能展示
  4. ARP攻击与ARP欺骗
  5. 最全的开源DDS中间件-FastDDS
  6. java实现打印机打印
  7. 一个文本框可能存在哪些漏洞
  8. win11什么时候发布的_2021专升本考试政策什么时候发布
  9. vscode-remote 无法写入文件“vscode-remote://ssh-remote
  10. CVPR2021投稿流程