1.?Lambda 表達(dá)式
Lambda 是一個(gè)匿名函數(shù),我們可以把 Lambda表達(dá)式理解為是一段可以傳遞的代碼(將代碼
像數(shù)據(jù)一樣進(jìn)行傳遞),本質(zhì)上還是一個(gè)匿名內(nèi)部類。
例 :Runnable r1=()->System.out.println("hehe");
2.函數(shù)式接口
只包含一個(gè)抽象方法的接口。
Java 內(nèi)置四大核心函數(shù)式接口
Consumer<T>??消費(fèi)型接口
Supplier<T>??供給型接口
Function<T, R>??函數(shù)型接口
Predicate<T>??斷定型接口
3.?方法引用
當(dāng)要傳遞給Lambda體的操作,已經(jīng)有實(shí)現(xiàn)的方法了,可以使用方法引用
? 對(duì)象::實(shí)例方法
? 類::靜態(tài)方法
? 類::實(shí)例方法
例:BinaryOperator bo1=(p1,p2)-> Math.pow(p1,p2);
? ? ? ?BinaryOperator bo2=Math::pow;
4.stream Api
?1.定義
? 數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列
? ?集合存取數(shù)據(jù),流計(jì)算數(shù)據(jù)
2.Stream 的操作三個(gè)步驟
創(chuàng)建 Stream
? ? ? ? 1.Collection 接口方法? stream()??parallelStream()
? ? ? ? 2.Arrays.?stream(T[] array)
? ? ? ? 3.Stream.of(T... values)? ?Stream.iterate()??Stream.generate(),
示例:

?中間操作
? ? ? 1).?篩選與切片
? ? ? ? ? ? ? ? filter(Predicate p)? ?過濾
? ? ? ? ? ? ? ? ?distinct()? ? ? 去重(根據(jù)equals y與hashCode方法去重)
? ? ? ? ? ? ? ? limit(long maxSize)? ?截?cái)?/p>
? ? ? ? ? ? ? ? skip(long n)? ?跳過
? ? ? ? ? ? ? ? 示例:



? ?2).映射
?map(Function f) :接收一個(gè)函數(shù)作為參數(shù),該函數(shù)會(huì)被應(yīng)用到每個(gè)元素上,并將其映射成一個(gè)新的元素。
flatMap(Function f)? :接收一個(gè)函數(shù)作為參數(shù),將流中的每個(gè)值都換成另一個(gè)流,然后把所有流連接成一個(gè)流(扁平化流)
sorted(Comparator comp) :排序
例:

總結(jié):中間操作類似于sql中對(duì)數(shù)據(jù)進(jìn)行篩選 ,排序,過濾,去重等,同時(shí)多了一個(gè)映射轉(zhuǎn)換的操作。
3).終結(jié)操作
查找與匹配
?????allMatch(Predicate p) 檢查是否匹配所有元素
????anyMatch(Predicate p)檢查是否至少匹配一個(gè)元素
????noneMatch(Predicate p)檢查是否沒有匹配所有元素
????findFirst()返回第一個(gè)元素
????findAny()返回當(dāng)前流中的任意元素
歸約
????reduce(BinaryOperator b)?
? ? ?用途:元素求和 與最大最小值等
例:

收集 統(tǒng)計(jì)
????collect(Collector c)
1.收集到集合中

2.規(guī)約收集

3.分組

groupingBy的第二個(gè)收集器可以是任何類型,可以其他收集器結(jié)合使用
4.分區(qū)
分區(qū)看作分組一種特殊情況
5.直接收集

5.并行流
????1.并行流就是把一個(gè)內(nèi)容分成多個(gè)數(shù)據(jù)塊,并用不同的線程分別處理每個(gè)數(shù)據(jù)塊的流
? ? 2.默認(rèn)的線程數(shù)量就是你的處理器數(shù)量,可通過系統(tǒng)參數(shù)修改
? ? ?System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","12");
? ?3.可以聲明性地通過 parallel() 與sequential() 在并行流與順序流之間進(jìn)行切換。
? ? 4. Fork/Join運(yùn)行流程

? ? ?5.工作竊取
????????采用 “工作竊取”模式(work-stealing):
????????當(dāng)執(zhí)行新的任務(wù)時(shí)它可以將其拆分分成更小的任務(wù)執(zhí)行,并將小任務(wù)加到線程隊(duì)列中,然后再從一個(gè)隨機(jī)線程的隊(duì)列中偷一個(gè)并把它放在自己的隊(duì)列中。相對(duì)于一般的線程池實(shí)現(xiàn),fork/join框架的優(yōu)勢體現(xiàn)在對(duì)其中包含的任務(wù)的處理方式上.在一般的線程池中,如果一個(gè)線程正在執(zhí)行的任務(wù)由于某些原因無法繼續(xù)運(yùn)行,那么該線程會(huì)處于等待狀態(tài).而在fork/join框架實(shí)現(xiàn)中,如果 某個(gè)子問題由于等待另外一個(gè)子問題的完成而無法繼續(xù)運(yùn)行.那么處理該子問題的線程會(huì)主動(dòng)尋找其他尚未運(yùn)行的子問題來執(zhí)行.這種方式減少了線程 的等待時(shí)間,提高了性能.
6.optional
略
7.新時(shí)間日期 API
? 1,基本api
LocalDate? 日期??LocalDate.of(2014, 3, 18)
LocalTime 時(shí)間? ? LocalTime.of(13, 45, 20)
LocalDateTime=LocalDate+LocalTime 日期+時(shí)間? ?LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
Instant 時(shí)間戳? (toEpochMilli() 與System.currentTimeMillis() 值相同)
Duration 時(shí)間差??Duration d1 = Duration.between(time1, time2);
Period 日期差??Period.between(LocalDate.of(2014, 3, 8), LocalDate.of(2014, 3, 18));
獲取信息??get(ChronoField)??
修改時(shí)間with()?plus?minus?方法 等? ?
2.時(shí)間調(diào)整
使用with(TemporalAdjuster)重載方法;
TTemporalAdjusters : 該類通過靜態(tài)方法提供了大量的常用 TemporalAdjuster 的實(shí)現(xiàn)
? 例:LocalDateTime.now().with(TemporalAdjusters.previous(DayOfWeek.MONDAY));
3.格式化
DateTimeFormatter?
format()格式化??parse()解析
DateTimeFormatter .ofPattern() 自定義格式
例:String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
4.時(shí)區(qū)
ZoneId對(duì)象與LocalDate、LocalDateTime或者是Instant對(duì)象整合起來,構(gòu)造為一個(gè)ZonedDateTime實(shí)例。

5.與原Date轉(zhuǎn)換
先轉(zhuǎn)換為instant ,再通過時(shí)區(qū)進(jìn)行轉(zhuǎn)換
date? <-? ?instant +zoneid? ?->? ?localdatetime(?localdate localtime 先轉(zhuǎn)localdatetime)
LocalDateTime 轉(zhuǎn)?instant :?LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant();
Date轉(zhuǎn)instant? :new Date().toInstant();
instant轉(zhuǎn)date:Date.from(Instant instant)
instant轉(zhuǎn)LocalDateTime:LocalDateTime.ofInstant(instant, zone)