筛选和切面的操作
- 用谓词筛选:
Stream<T> filter(Predicate<? super T> predicate)
- 筛选各异的元素:
Stream<T> distinct()
- 截短流:
Stream<T> limit(long maxSize)
- 跳过元素:
Stream<T> skip(long n)
映射
对流中的每一个元素应用函数:<R> Stream<R> map(Function<? super T, ? extends R> mapper);
流的扁平化:将各个流扁平化成单个流(例子,找出字符串数组中的所有字符)
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
查找和匹配
- 至少匹配一个元素:
boolean anyMatch(Predicate<? super T> predicate)
- 匹配所有元素:
boolean allMatch(Predicate<? super T> predicate)
- 都不匹配:
boolean noneMatch(Predicate<? super T> predicate)
- 查找随意一个元素:
Optional<T> findAny()
- 查找第一个:
Optional<T> findFirst()
归约
T reduce(T identity, BinaryOperator<T> accumulator);
int sum = numbers.stream().reduce(0, (a, b) -> a + b);
int sum = numbers.stream().reduce(0, Integer::sum);
还有一个无初始化的方法Optional<T> reduce(BinaryOperator<T> accumulator)
Optional<Integer> sum = numbers.stream().reduce((a, b) -> (a + b));
流的特化
提供了三个原始类型特化流接口来解决这个问题:IntStream、DoubleStream、LongStream
,他们提供了进行常用数值归约的新方法,比如sum
,max
等。
- 映射到数值流:
int calories = menu.stream().mapToInt(Dish::getCalories).sum();
- 转换回对象流:
IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.boxed();
- 生成数值范围
IntStream.rangeClosed(1, 100) //闭区间
IntStream.range(1, 100) //开区间
生成流
- 由值创建流
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
- 由数组创建流
int[] numbers = {2, 3, 5, 7, 11, 13};
int sum = Arrays.stream(numbers).sum();
- 由文件生成流
long uniqueWords = 0;
try(Stream<String> lines =Files.lines(Paths.get("data.txt"),Charset.defaultCharset())){
uniqueWords = lines.flatMap(line -> Arrays.stream(line.split(" "))).distinct().count();
}catch(IOException e){
}
- 创建无限流
Stream.iterate(0, n -> n + 2).limit(10).forEach(System.out::println);
Stream.generate(Math::random).limit(5).forEach(System.out::println);