流操作筆記
流查找值
終端操作
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()