lambda 对象去重_最火的java8新特性:Lambda 表达式
主要內(nèi)容
1. Lambda 表達(dá)式
2. 函數(shù)式接口
3. 方法引用與構(gòu)造器引用
4. Stream API
5. 其他新特性
Java 8新特性簡(jiǎn)介
速度更快
代碼更少(增加了新的語(yǔ)法 Lambda 表達(dá)式)
強(qiáng)大的 Stream API
便于并行
最大化減少空指針異常 Optional
1、Lambda表達(dá)式
Lambda 是一個(gè)匿名函數(shù)
在Java 語(yǔ)言中引入了一個(gè)新的語(yǔ)法元
素和操作符。這個(gè)操作符為 “->” , 該操作符被稱
為 Lambda 操作符或剪頭操作符。它將 Lambda 分為
兩個(gè)部分:
左側(cè):指定了 Lambda 表達(dá)式需要的所有參數(shù)
右側(cè):指定了 Lambda 體,即 Lambda 表達(dá)式要執(zhí)行
的功能。
2、Lambda 表達(dá)式語(yǔ)法
語(yǔ)法格式一:無(wú)參,無(wú)返回值,Lambda 體只需一條語(yǔ)句
Runnable r1 = () → System.out.println("hello world");語(yǔ)法格式二:Lambda 需要一個(gè)參數(shù)
Consumerfun = (args) → System.out.println(args);語(yǔ)法格式三:Lambda 只需要一個(gè)參數(shù)時(shí),參數(shù)的小括號(hào)可以省略
Consumerfun = args → System.out.println(args);語(yǔ)法格式四:Lambda 需要兩個(gè)參數(shù),并且有返回值
BinaryOperator<Long> bo = (x, y) → {System.out.println("hello world");reurn x + y;}語(yǔ)法格式五:當(dāng) Lambda 體只有一條語(yǔ)句時(shí),return 與大括號(hào)可以省略
BinaryOperator<Long> bo = (x, y) → x + y;語(yǔ)法格式六:數(shù)據(jù)類型可以省略,因?yàn)榭捎删幾g器推斷得出,稱為“類型推斷”
BinaryOperator<Long> bo = (Longx, Long y) → {System.out.println("hello world");reurn x + y;}類型推斷:
上述 Lambda 表達(dá)式中的參數(shù)類型都是由編譯器推斷
得出的。Lambda 表達(dá)式中無(wú)需指定類型,程序依然可
以編譯,這是因?yàn)?javac 根據(jù)程序的上下文,在后臺(tái)
推斷出了參數(shù)的類型。Lambda 表達(dá)式的類型依賴于上
下文環(huán)境,是由編譯器推斷出來(lái)的。這就是所謂的
“類型推斷”
2、函數(shù)式接口
(1) 只包含一個(gè)抽象方法的接口,稱為函數(shù)式接口。
(2) 你可以通過(guò) Lambda 表達(dá)式來(lái)創(chuàng)建該接口的對(duì)象。(若 Lambda?
表達(dá)式拋出一個(gè)受檢異常,那么該異常需要在目標(biāo)接口的抽象方
法上進(jìn)行聲明)。
(3) 我們可以在任意函數(shù)式接口上使用 @FunctionalInterface 注解,
這樣做可以檢查它是否是一個(gè)函數(shù)式接口,同時(shí) javadoc 也會(huì)包
含一條聲明,說(shuō)明這個(gè)接口是一個(gè)函數(shù)式接口。
自定義函數(shù)式接口
@FounctionalInterfacepublic interface MyNumber {public double getValue();}@FounctionalInterfacepublic interface MyNumber<T> {public T getValue(T t);}
作為參數(shù)傳遞 Lambda 表達(dá)式
ListenableFuture<Integer> speechTechniqueMacdFuture = executorService.submit( () -> 1+1);3、Java 內(nèi)置四大核心函數(shù)式接口
| Consumer | T | void | 對(duì)類型為T的對(duì)象應(yīng)用操 作,包含方法: void accept(T t) | 
| Supplier供給型 | 無(wú)? | T? | 返回類型為T的對(duì)象,包 | 
| Function函數(shù)型 | T? | R | 對(duì)類型為T的對(duì)象應(yīng)用操作,并返回結(jié)果。結(jié)果是R類型的對(duì)象。包含方法:R apply(T t) | 
| Predicate斷定型 | T | boolea | 確定類型為T的對(duì)象是否滿足某約束,并返回boolean 值。包含方法boolean test(T t) | 
4、方法引用與構(gòu)造器引用
方法引用:使用操作符 “::” 將方法名和對(duì)象或類的名字分隔開來(lái)
對(duì)象::實(shí)例方法
類::靜態(tài)方法
類::實(shí)例
Functionin = Integer[]::new;.stream().sorted(Comparator.comparingLong(ConditionAllVO::getStockTotalCount).reversed()).collect(Collectors.toList()))5、強(qiáng)大的 Stream API
是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列“集合講的是數(shù)據(jù),流講的是計(jì)算
注意:
(1)Stream 自己不會(huì)存儲(chǔ)元素。
(2)Stream 不會(huì)改變?cè)磳?duì)象。相反,他們會(huì)返回一個(gè)持有結(jié)果的新Stream。
(3)Stream 操作是延遲執(zhí)行的。這意味著他們會(huì)等到需要結(jié)果的時(shí)候才執(zhí)行
Lists.newArrayList().stream() : 返回一個(gè)順序流Lists.newArrayList().parallelStream() : 返回一個(gè)并行流Arrays.stream(new Integer[1]).count();Stream stream = Stream.of(Lists.newArrayList());Stream 的中間操作
多個(gè)中間操作可以連接起來(lái)形成一個(gè)流水線,除非流水線上觸發(fā)終止操作,
否則中間操作不會(huì)執(zhí)行任何的處理!而在終止操作時(shí)一次性全部處理,稱為“惰性求值”。
篩選
| filter(Predicate p) | 接收 Lambda , 從流中排除某些元素。 | 
| distinct() | 篩選,通過(guò)流所生成元素的 hashCode() 和 equals() 去除重復(fù) | 
| limit(long maxSize) | 截?cái)嗔?#xff0c;使其元素不超過(guò)給定數(shù) | 
| skip(long n) | 跳過(guò)元素,返回一個(gè)扔掉了前 n 個(gè)元素的流。若流中元素不足 n 個(gè),則返回一個(gè)空流。與 limit(n)??互補(bǔ) | 
映射
| map(Function f) | 接收一個(gè)函數(shù)作為參數(shù),該函數(shù)會(huì)被應(yīng)用到每個(gè)素上,并將其映射成一個(gè)新的 | 
| mapToDouble(ToDoubleFunction f) | 接收一個(gè)函數(shù)作為參數(shù),該函數(shù)會(huì)被應(yīng)用到每個(gè)元 | 
| mapToInt(ToIntFunction f) | 接收一個(gè)函數(shù)作為參數(shù),該函數(shù)會(huì)被應(yīng)用到每個(gè)元素上,產(chǎn)生一個(gè)新的 IntStream | 
| mapToLong(ToLongFunction f) | 接收一個(gè)函數(shù)作為參數(shù),該函數(shù)會(huì)被應(yīng)用到每個(gè)元素上,產(chǎn)生一個(gè)新的 LongStream | 
| flatMap(Function f) flatMapToDouble(Function f) flatMapToInt(Function f) flatMapToLong(Function f) | 接收一個(gè)函數(shù)作為參數(shù),將流中的每個(gè)值都換成另一個(gè)流,然后把所有流連接成一個(gè)流 | 
排序
| sorted() | 產(chǎn)生一個(gè)新流,其中按自然順序 | 
| sorted(Comparator comp) | 產(chǎn)生一個(gè)新流,其中按比較器順序 | 
查找與匹配
| allMatch(Predicate p) | 檢查是否匹配所有元素 | 
| anyMatch(Predicate p) | 檢查是否至少匹配一個(gè)元素 | 
| noneMatch(Predicate p) | 檢查是否沒有匹配所有元素 | 
| findFirst() | 返回第一個(gè)元素 | 
| findAny() | 返回當(dāng)前流中的任意元素 | 
| count() | 返回流中元素個(gè)數(shù) | 
| max(Comparator c) | 返回流中最大值 | 
| min(Comparator c) | 返回流中最小值 | 
| forEach(Consumer c) | 內(nèi)部迭代(使用 Collection 接口需要用戶去做迭代,稱為外部迭代。相反,Stream API 使用內(nèi)部迭代——它幫你把迭代做了 | 
歸約
| reduce(T iden, BinaryOperator b) | 可以將流中元素反復(fù)結(jié)合起來(lái),得到一個(gè)值。返回 T | 
| reduce(BinaryOperator b) | 可以將流中元素反復(fù)結(jié)合起來(lái),得到一個(gè)值。返回 Optional | 
收集
| collect(Collector c) | 將流轉(zhuǎn)換為其他形式。接收一個(gè) Collector接口的實(shí)現(xiàn),用于給Stream中元素做匯總的方法 | 
| toList | List | 把流中元素收集到List:list.stream().collect(Collectors.toList()); | 
| toSet | Set | 把流中元素收集到Set:list.stream().collect(Collectors.toSet()); | 
| toCollection | Collection | 把流中元素收集到創(chuàng)建的集合:list.stream().collect(Collectors.toCollection(ArrayList::new)); | 
| counting | Long | 計(jì)算流中元素的個(gè)數(shù):list.stream().collect(Collectors.counting()); | 
| summingInt | Integer | 對(duì)流中元素的整數(shù)屬性求和:list.stream().collect(Collectors.summingInt(類名::屬性名)); | 
| averagingInt | Double | 計(jì)算流中元素Integer屬性的平均值:list.stream().collect(Collectors.averagingInt(類名::屬性名)); | 
| summarizingInt summarizingLong summarizingDouble | IntSummaryStatistics | 收集流中Integer屬性的統(tǒng)計(jì)值:list.stream().collect(Collectors.summarizingInt(類名::屬性名)); 一次性得到元素個(gè)數(shù)、總和、均值、最大值、最小值 | 
| joining | String | 連接流中每個(gè)字符串: | 
| maxBy | Optional | 根據(jù)比較器選擇最大值: list.stream().collect(Collectors.maxBy(comparingInt(類名::屬性名))); | 
| minBy | Optional | 根據(jù)比較器選擇最小值:list.stream().collect(Collectors.minBy(comparingInt(類名::屬性名)) | 
| reducing | 歸約產(chǎn)生的類型 | 從一個(gè)作為累加器的初始值開始,利用BinaryOperator與流中元素逐個(gè)結(jié)合,從而歸約成單個(gè)值 list.stream().collect(Collectors.reducing(0,?類名::屬性名, Integer::sum)); | 
| collectingAndThen | 轉(zhuǎn)換函數(shù)返回的類型 | 包裹另一個(gè)收集器,對(duì)其結(jié)果轉(zhuǎn)換函數(shù):list.stream().collect(Collectors.collectingAndThen(Collectors.toList(), List::size)); | 
| groupingBy 根據(jù) | Map | 某屬性值對(duì)流分組,屬性為K,結(jié)果為V: list.stream().collect(Collectors.groupingBy(?類名::屬性名)); | 
| partitioningBy | Map> | 根據(jù)true或false進(jìn)行分區(qū):list.stream().collect(Collectors.partitioningBy(類名::屬性名) | 
6、并行流與串行流
并行流就是把一個(gè)內(nèi)容分成多個(gè)數(shù)據(jù)塊,并用不同的線程分
別處理每個(gè)數(shù)據(jù)塊的流。
Java 8 中將并行進(jìn)行了優(yōu)化,我們可以很容易的對(duì)數(shù)據(jù)進(jìn)行并
行操作。Stream API 可以聲明性地通過(guò) parallel() 與
sequential() 在并行流與順序流之間進(jìn)行切換。
7、Optional 類
Optional 類(java.util.Optional) 是一個(gè)容器類,代表一個(gè)值存在或不存在,
原來(lái)用 null 表示一個(gè)值不存在,現(xiàn)在 Optional 可以更好的表達(dá)這個(gè)概念。并且
可以避免空指針異常。
常用方法:
Optional.of(T t) : 創(chuàng)建一個(gè) Optional 實(shí)例
Optional.empty() : 創(chuàng)建一個(gè)空的 Optional 實(shí)例
Optional.ofNullable(T t):若 t 不為 null,創(chuàng)建 Optional 實(shí)例,否則創(chuàng)建空實(shí)例
isPresent() : 判斷是否包含值
orElse(T t) : 如果調(diào)用對(duì)象包含值,返回該值,否則返回t
orElseGet(Supplier s) :如果調(diào)用對(duì)象包含值,返回該值,否則返回 s 獲取的值
map(Function f): 如果有值對(duì)其處理,并返回處理后的Optional,否則返回 Optional.empty()
flatMap(Function mapper):與 map 類似,要求返回值必須是Optional
總結(jié)
以上是生活随笔為你收集整理的lambda 对象去重_最火的java8新特性:Lambda 表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: python linux解密zip_Py
- 下一篇: input python 验证int_全
