流操作笔记
流查找值
终端操作
findAll() //查找流中的任意元素并返回 使用Optional<T>容器类类,就可以避免查找返回null
findfirst() //查找流中的第一个元素并返回 使用Optional<T>容器类类,就可以避免查找返回null
Optional<T>类容器类
常用终端操作,配合查找操作使用
isPresent() 将容器类中包含值时返回true,不存在则返回false
ifPresent(Consumer<T> block) 会在容器类存在值时返回语句块结果(返回void的Lambda
表达式。)
T get()会在值存在时返回值,否则抛出一个NoSuchElement异常
T orElse(T other) 当容器类中不存在时返回设置的默认值。
流的归纳操作
数据归纳
int calories = menu.stream()
.mapToInt(Dish::getCalories)
.sum();
求最大值
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = numbers.stream().reduce(Integer::max);
System.out.println(max.orElse(0));
System.out.println(numbers.stream().max(Integer::compare).get());
System.out.println(numbers.stream().mapToInt(i -> i).max().getAsInt());
统计操作
count()
创建流操作
由值创建流
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
stream.map(String::toUpperCase).forEach(System.out::println); //字符传大写
数组创建流
int[] numbers = {2, 3, 5, 7, 11, 13};
int sum = Arrays.stream(numbers).sum();
由函数创建流:创建无限流
Stream API提供了两个静态方法来从函数生成流:Stream.iterate和Stream.generate。
这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样有固定大小的流。由iterate
和generate产生的流会用给定的函数按需创建值,因此可以无穷无尽地计算下去!一般来说,
应该使用limit(n)来对这种流加以限制,以避免打印无穷多个值
Stream.iterate(0, n -> n + 2)
.limit(10)
.forEach(System.out::println);
流的收集
终端操作
collect()
填入参数为Collectors工厂类的方法
常用工厂类静态方法
toList()
groupingBy()