課程設(shè)計(jì)代做網(wǎng)站推薦優(yōu)化疫情二十條措施
1. 簡(jiǎn)介
目前響應(yīng)式編程的學(xué)習(xí)中很多時(shí)候都用到了Lambda表達(dá)式和StreamAPI,那么今天就在這里記錄一下一些最基本的使用方法。
StreamAPI中引入了流的概念,其將集合看作一種流,流在管道中傳輸(動(dòng)態(tài)的),可以在管道的不同節(jié)點(diǎn)上進(jìn)行處理,如篩選、排序、聚合等。
- 流的三部分 數(shù)據(jù)流、N個(gè)中間操作、一個(gè)終止操作
- 流需寫成一個(gè)整體,因?yàn)?strong>流的所有操作是無狀態(tài)的,數(shù)據(jù)狀態(tài)僅在當(dāng)前流內(nèi)有效,外部不要對(duì)流中的操作產(chǎn)生影響比如增刪改啥的
- 流一些操作默認(rèn)跟for循環(huán)差不多(單線程,流中的每個(gè)元素要完整經(jīng)過一邊流操作才能到下一個(gè)元素),要想多線程要調(diào)用
parallel()
操作,使得其變成一個(gè)并發(fā)流,但與此同時(shí)也需要取解決線程安全問題(加鎖) - 流在大數(shù)據(jù)量的時(shí)候比for循環(huán)效率高(stream作為一個(gè)管道,其中定義了一系列回調(diào)函數(shù),可以理解為沒有事就不做事,有事的時(shí)候jvm底層自動(dòng)幫我們調(diào)用)
2. 數(shù)據(jù)流的創(chuàng)建
Stream<Integer> stream1 = Stream.of(1,2,3);Stream<Integer> stream2 = Stream.concat(Stream.of(2,3,4), stream1);
// 調(diào)用構(gòu)造器方法,記得最后要調(diào)用build()方法
Stream<Object> stream3 = Stream.builder().add("11").add("12").build();//常用: 調(diào)用集合容器本身的stream()方法
//list
List<Integer> list = List.of(1,2);
Stream<Integer> stream4 = list.stream();//set
Set<Integer> set = Set.of(1,2);
Stream<Integer> stream5 = set.stream();//map 分別獲取key和value的集合后再stream
Map<Object,Integer> map;
Stream<Object> stream6 = map.keySet().stream();
Stream<Integer> stream7 = map.values().stream();
3. 中間操作
- filter: 過濾,選出需要的元素
- map: 映射,而且事一一映射
- mapToInt、mapToLong、mapToDouble
- flatMap:一對(duì)多映射
// 自己定義一個(gè)Person類
List<Person> list = List.of(new Person("charles bibi",11),new Person("katie pesto",12),new Person("paul garba",13),new Person("peter park",14),new Person("rachel chen",15),);list.stream().skip(1) // 跳過前面i個(gè)元素.filter(person -> person.getAge() > 13) // 過濾獲取年齡大于13的人.map(person -> person.getName) // 獲取年齡大于13的人的名字,這時(shí)候就是Stream<String>了.peek(System.out::println) // peek方法對(duì)每個(gè)元素執(zhí)行操作,但不改變?cè)乇旧怼?/span>.flatMap(name -> {String[] temp = name.split(" "); // 根據(jù)空格切分,獲得姓和名return Arrays.stream(temp);}).distinct() // 去重.foreach(System.out::println); // 輸出來看一看
3.1 takeWhile()
takewhile()
方法當(dāng)不滿足操作時(shí)直接結(jié)束流操作,而filter()
方法無條件執(zhí)行每一個(gè)元素
List<Integer> collect = List.of(1,2,3,4,5,6).stream().sorted() // 進(jìn)行排序(默認(rèn)降序).takewhile(i -> i>2).collect(Collectors.toList());
4. 終止操作(一些簡(jiǎn)單的就不實(shí)現(xiàn)啦,基本沒有參數(shù)直接調(diào)用)
forEach
: 對(duì)每個(gè)元素執(zhí)行操作。toArray
: 將流元素轉(zhuǎn)化為數(shù)組。
// 創(chuàng)建一個(gè)整數(shù)流
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用toArray方法將流轉(zhuǎn)換為數(shù)組
Integer[] array = numberStream.toArray(Integer[]::new);
reduce
: 使用BinaryOperator組合流元素。
// 創(chuàng)建一個(gè)整數(shù)流
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用reduce方法將流中的元素組合起來生成一個(gè)值
// 第一個(gè)參數(shù)為累積操作的初始值0, 第二個(gè)為改變初始值的方法
int sum = numberStream.reduce(0, (a, b) -> a + b);
collect
: 將流元素收集到某些數(shù)據(jù)結(jié)構(gòu)中,如List、Set或自定義數(shù)據(jù)結(jié)構(gòu)。min/max
: 查找流中的最小或最大元素。
// 創(chuàng)建一個(gè)整數(shù)流
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用max方法獲取流中的最大值
// Integer::compareTo方法引用作為比較器。并通過orElse方法處理可能的空值情況
int maxValue = numberStream.max(Integer::compareTo).orElse(0);
count
: 計(jì)算流中的元素?cái)?shù)量。anyMatch/allMatch/noneMatch
: 檢查流中是否至少有一個(gè)元素滿足條件,所有元素都滿足條件,或者沒有元素滿足條件。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 是否有大于3的元素, 返回boolean值
boolean anyMatch = numbers.stream().anyMatch(number -> number > 3);
findFirst/findAny
: 查找流中的第一個(gè)元素或者任意一個(gè)元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Optional<Integer> anyNumber = numbers.stream().filter(number -> number % 2 == 0).findAny();if (anyNumber.isPresent()) {System.out.println("找到的任意一個(gè)偶數(shù):" + anyNumber.get());
} else {System.out.println("沒有找到偶數(shù)");
}
forEachOrdered
: 以遇到的順序?qū)α髦械拿總€(gè)元素執(zhí)行操作,與forEach類似但有順序保證。