文章目录
引言
Streams遵循"what,no how"原则。
流和集合的区别:
- 流不存储元素。他们可以被存储在隐式的集合中或者按命令生成。
- 流操作不改变源。
- 流操作是懒惰型的,他们只有在实际调用到的时候才会执行。
学习Stream的前提是掌握Lambda表达式!
stream的工作流:
- 创建stream
- 采用详尽的中间操作将初始的stream转换为另一个stream,即相当于链式调用
- 采用终止的操作产生一个结果,此后stream不再使用
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
stream()创建流;filter,mapToInt()转换;sum()终止。
创建Stream
流的创建主要有以下几种:
- Collection的实现类例如List,Set,Queue等调用stream()方法:
Stream<String> colle = new ArrayList<String>().stream();
- 数组类型调用Arrays.stream()方法/可变参数类型调用Stream.of()方法:
int[] ints = {
1, 2, 3};
Arrays.stream(ints);
Arrays.stream(ints, 1, 2);//可以指定生成的起始和终点
Stream.of(1, 2, 3);
- 创建一个空的流:
Stream<String> silence = Stream.empty();
- 从文件读取一个流:
Path path = Paths.get("D:\\hhh\\test.xml");
Files.lines(path).forEach(System.out::println);
- 无限流,用Stream.generate方法和Stream.iterate方法:
//常量Stream
Stream<String> echos = Stream.generate(() -> "Echo");
//随机数Stream
Stream<Double> randoms = Stream.generate(Math::random);
Stream.iterate(new Integer(1), (x)-> x+1).forEach(System.out::println);
转换
filter(),map(),flatMap()
filter()过滤
例如筛选字符串长度,通常流中的元素个数会减少。
List<String> list = Arrays.asList("a", "ab", "ba", "c");
list.stream()
.filter((x)-> x.length() > 1)
.forEach(System.out::println);
输出:
ab
ba
map()映射
例如大小写转换。流中元素个数不变。
List<String> list = Arrays.asList("a&#