Lambda表示式Lambda是函數式介面的匿名實現類的例項物件,函數式介面使用@FunctionalInterface註解來限制介面只能有一個待實現的方法格式-> 箭頭操作符->的左邊是入參,入參的
2021-06-09 12:08:45
Lambda是函數式介面的匿名實現類的例項物件,函數式介面使用@FunctionalInterface註解來限制介面只能有一個待實現的方法
格式
簡寫格式
無參 + 無返回值
() -> System.out.println("xxx");
無參時入參需要寫成(),當方法體只有一行時,可以省略掉{}
有參 + 無返回值
(String s1) -> System.out.println(s1);(String s1, String s2) -> System.out.println(s1 + s2);
入參數據類型省略
省略入參類型,會由編譯器進行類型推斷
(s1) -> System.out.println(s1);(s1, s2) -> System.out.println(s1 + s2);
只有一個入參
s1 -> System.out.println(s1);
有返回值
方法體只有一行,可省略return
i1 -> String.valueOf(i1);
直接方法引用,入參和return都可以省略
String::valueOf
方法體有多行,{}和return都不可省略
i1 -> { System.out.println(i1); return String.valueOf(i1);}
這是一種高階的迭代器,用來操作集合,如查詢和過濾等常見操作
Stream操作的過程分為:創建Stream物件 -> 中間操作 -> 終止操作
知識點:
創建流
序列流
int[] nums = {1, 2, 3, 4, 5};// 以下兩個陣列的類型任意Arrays.stream(nums);Stream.of(nums);// 基本類型對應的Stream類.of()方法IntStream.of(nums);// 創建1-9的int流IntStream.range(1, 10).forEach(System.out::println);// 創建1-10的int流IntStream.rangeClosed(1, 10).forEach(System.out::println);
並行流
int[] nums = {1, 2, 3, 4, 5};// 可由序列流得到IntStream.of(nums).parallel();// 由集合得到Arrays.asList(nums).parallelStream();
中間操作
中間操作分為:無狀態和有狀態操作
無狀態
map/mapToXxx,map能否改變元素類型要看map方法的入參
int[] nums = {1, 2, 3, 4, 5};// map對每個元素執行一次操作,不可改變元素的類型,因為此map入參是UnaryOperator<T>IntStream.of(nums).map(it -> it + 1).forEach(System.out::println);// 改變元素類型IntStream.of(nums).mapToObj(it -> String.format("[%d]", it)).forEach(System.out::println);// map可以改變元素類型,因為map入參是Function<T, R>ArrayList<Test> list1 = Lists.newArrayList(new Test(1, "a"), new Test(2, "b"));List<Test2> list2 = list1.parallelStream().map(it -> { return new Test2(it.getId());}).collect(Collectors.toList());
flatMap/flatMapToXxx
@Data@AllArgsConstructorpublic static class Test { private int id; private int[] data;}ArrayList<Test> list1 = Lists.newArrayList(new Test(1, new int[]{1, 2, 3}), new Test(2, new int[]{4, 5, 6}));list1.parallelStream() // Stream<Test>流 .flatMapToInt(it -> IntStream.of(it.getData())) // 將data陣列轉成IntStream流 // 上面執行flatMapToInt之後得到一個完整的IntStream流,接下來可以進行IntStream流的一些操作了 .map(it -> it + 1) .forEach(System.out::println);
filter
int[] nums = {1, 2, 3, 4, 5};IntStream.of(nums).filter(it -> it > 3).forEach(System.out::println);
peek
int[] nums = {1, 2, 3, 4, 5};IntStream.of(nums).peek(System.out::println).forEach(System.out::println);
有狀態
終止操作
注意:並行流呼叫forEach是不保證順序的
reduce
int[] nums = {1, 2, 3, 4, 5};// reduce第一個參數是初始值,第二個參數是BinaryOperator,輸入兩個數返回相加的結果,然後再和上一次的結果相加,最終得到整個流中所有元素相加的和System.out.println(IntStream.of(nums).reduce(0, Integer::sum));
BigDecimal求和
ArrayList<Test3> list3 = Lists.newArrayList(new Test3(1L, 1, 5.5), new Test3(2L, 2, 3.2));BigDecimal reduce = list3.parallelStream() .map(it -> BigDecimal.valueOf(it.getPrice()).multiply(BigDecimal.valueOf(it.getQty()))) .reduce(BigDecimal.ZERO, BigDecimal::add);System.out.println(reduce);
執行緒池
並行流預設使用自帶的ForkJoinPool,執行緒數是CPU核心數,可以指定自定義的執行緒池
int[] nums = {1, 2, 3, 4, 5};// 使用預設的ForkJoinPoolIntStream.of(nums).parallel().forEach(it -> { System.out.println(Thread.currentThread().getName() + ":" + it);});// 自定義一個ForkJoinPoolForkJoinPool pool = new ForkJoinPool(2);pool.submit(() -> { IntStream.of(nums).parallel().forEach(it -> { System.out.println(Thread.currentThread().getName() + ":" + it); });});Thread.currentThread().join();
>作者:飛翔的程式碼
連結:https://juejin.cn/post/6971334003097862158
來源:掘金
相關文章
Lambda表示式Lambda是函數式介面的匿名實現類的例項物件,函數式介面使用@FunctionalInterface註解來限制介面只能有一個待實現的方法格式-> 箭頭操作符->的左邊是入參,入參的
2021-06-09 12:08:45
出品|開源中國文|局長Vue.js v3.1.0 (Pluto) 已釋出,目前的最新版本為 3.1.1。新版本增加了多項新特性,優化了效能,以及修復 bug,同時還有一些破壞性的變化。新特性Migration Bu
2021-06-09 11:54:06
【TechWeb】6月9日訊息,日前,在第六屆國際氫能與燃料電池汽車大會(FCVC 2021)上,未勢能源董事長張天羽首次對外公佈「雙子星計劃」,攜電堆、燃料電池系統、儲氫三大領域技術專家公
2021-06-09 11:52:23
說小米11之前,先來和大家說一下這款產品的優缺點。作為小米今年主打的常規旗艦,小米11多個方面均有出色表現,尤其是在外觀、螢幕、效能、價效比等方面更是不乏亮點,這也是其優點
2021-06-09 11:50:10
雖然當下各大手機品牌都在專注於攝像頭的研發,但是對於攝影來說,手機並不能滿足所有拍攝場景,尤其是對於追求高品質的年輕人來說,購買相機的熱情只增不減。我們都知道富士的無反
2021-06-09 11:48:03
#榮耀#榮耀全新旗艦手機-榮耀 50系列將於6月16日在上海釋出,臨近釋出,有關榮耀50系列的爆料越來越重磅:榮耀正式公佈當紅小生-龔俊出任榮耀50系列代言人,藉由代言人之手,榮耀官微
2021-06-09 11:30:07