Java JDK 1.8 新特性 Stream流
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流相关推荐
- java的collect用法_java8新特性:stream流中collect用法
java8新特性:stream流中collect用法 java8新特性:stream流中collect用法 1.toList List collectList = Stream.of(1, 2, 3, ...
- Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例
Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例 目录 文章目录 1.count:计数-终结方法 2.limit:取前几个元素-延迟方法 3.skip: ...
- Java复习第11天---11.3---Java8新特性---Stream流特点和常用方法2
Java复习第11天---11.3---Java8新特性---Stream流特点和常用方法2 目录 文章目录 1.Stream流特点 2.filter:过滤 3.map:映射 ***后记*** : 内 ...
- Java复习第11天---11.2---Java8新特性---Stream流获取方式和常用方法1
Java复习第11天---11.2---Java8新特性---Stream流获取方式和常用方法1 目录 文章目录 1.Stream流的2中获取方式 1.1.集合的stream方法 1.2.Stream ...
- Java8新特性Stream流详解
陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...
- Java8新特性——Stream流:不同于IO流的流,操作集合数据
文章目录 Stream流 1.认识Stream流(源码说明) 1.1.Stream流和Collection的区别 1.2.流的获取方式 1.3.流操作和管道 1.4.并行性 1.5.不干扰内政 1.6 ...
- stream流_最详细的JDK8新特性————Stream流
Stream流 在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊 端. 传统集合的多步遍历代码: 几乎所有的集合(如Collect ...
- java8新特性stream流
参考自深蓝至尊的Java8 新特性之流式数据处理 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式 ...
- stream distinct去重_再来看看Java的新特性——Stream流
半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...
最新文章
- 关于编程的浅学习与深学习
- 【linux】【tcpdump】linux之tcpdump抓包及wireshark分析详解
- 【互联网大会】微信小程序斩获大奖 马化腾谈小程序开发生态
- gamebryo坐标系
- CommonJS模块的循环加载
- 网络七层协议_IT人计算机网络浅析
- 基于TI AM335x创龙开发板的快速体验
- linux临时网络配置
- loadrunner中定义数组
- sqlite如何与mysql连接数据库连接_c#中怎么连接到sqlite数据库?
- D触发器的工作原理以及Verilog代码(一/二)
- python大神年薪_我程序员年薪 80 万被亲戚鄙视不如在二本教书的博士生?
- 运算放大器单电源设计
- 主要计算机网络设备及其主要用途
- 关于mysql的时区(下):如何设置mysql的时区
- MA Chapter 3 Presenting information(SRCharlotte)
- 最小均方算法二分类(基于双月数据集)
- 我的世界服务器防挂机系统指令,我的世界反作弊和防飞行指令分享
- ZedBoard教程PL篇(2):按键检测
- STM32实现DAC功能输出音频波形
热门文章