Java8新特性之Stream流
Stream流感觉是我本人听的最多的Java8新特性了,但我感觉听得多,真要将他的用法,还是讲不出来,看来还是用的太少了。
- stream流的创建
- 通过Stream.of()静态方法创建
// of为Stream的静态方法
Stream<String> strStream = Stream.of("hello", "java8", "stream");
// 或者使用基本类型流
IntStream intStream = IntStream.of(1, 2, 3);
- 通过集合.stream创建
- 通过数组创建 Arrays.stream
- 迭代器创建
// 生成100个奇数,加上limit否则就是无限流了
Stream<Integer> stream = Stream.iterate(1, n -> n + 2).limit(100);
stream.forEach(System.out::println);
- 用IO
// 获取指定路径下文件信息,list方法返回Stream类型
Stream<Path> pathStream = Files.list(Paths.get("/"));
- Stream流的常用操作
- .Map()
将流中每个数据映射出来
// 初始化一个不可变字符串
List<String> words = ImmutableList.of("hello", "java8", "stream");
// 计算列表中每个单词的长度
List<Integer> list = words.stream()
.map(String::length)
.collect(Collectors.toList());
// output: 5 5 6
list.forEach(System.out::println);
- .flatMap()
将流中每个元素取出来转成另外一个输出流,再通过扁平化形成一个流
Stream<String> strStream = words.stream()
.map(word -> word.split("-"))
.flatMap(Arrays::stream)
.distinct();
// output: hello java8 stream
strStream.forEach(System.out::println);
因为.split会将其拆分为String[]故使用flatMap
- filter()
顾名思义,通过条件过滤流数据 - 终端操作,即将stream流转换成具体的返回值
// 找出最大的值
List<Integer> integers = Arrays.asList(6, 20, 19);
integers.stream()
.max(Integer::compareTo)
.ifPresent(System.out::println);
// output: 20
- Stream流的天坑
- stream流不能重复消费
List<String> strings = Arrays.asList("hello", "java8", "stream");
Stream<String> stream = strings.stream();
stream.forEach(System.out::println); // ok
stream.forEach(System.out::println); // IllegalStateException
- Stream流的数据不可中途修改
List<String> strings = Arrays.asList("hello", "java8", "stream");
// expect: HELLO JAVA8 STREAM WORLD, but throw UnsupportedOperationException
strings.stream()
.map(s -> {
strings.add("world");
return s.toUpperCase();
}).forEach(System.out::println);
stream流我个人理解是类似于lambda语句的高大上简洁代码格式,看的人赏心悦目