第一章: Stream流java
這裏的 Stream,是在 Java 8 中,由於 Lambda 帶來的函數式編程,引入的一個全新的 Stream 概念,用於解決已有集合中既有的弊端。算法
//傳統的寫法編程 public class Test1{數組 public static void main(String[] args) {數據結構 ArrayList<String>list=new ArrayList<>();app list.add("李文傑");函數式編程 list.add("李文集");函數 list.add("李文潔");spa list.add("王智雅");對象 list.add("何舒雅"); list.add("王文文"); //傳統的寫法 for(String ss:list){ System.out.println(ss); } } 這是一段很是簡單的集合遍歷操做,集合中的字符串都進行輸出操做 |
Java jdk8 以前的代碼:
public class Test1{ public static void main(String[] args) { ArrayList<String>list=new ArrayList<>(); list.add("李文傑"); list.add("李文集"); list.add("李文潔"); list.add("王智雅"); list.add("何舒雅"); list.add("王文文"); ArrayList<String>li=new ArrayList<>(); //傳統的寫法 for(String ss:list){ if(ss.startsWith("李")){ li.add(ss); } } for(String ss2: li){ System.out.println(ss2); } } } |
分析這段代碼中兩個 for 循環:
一、 首先篩選全部姓李的人
二、 而後存入到新的集合中
三、 最後進行篩選結果的輸出
每當咱們須要對集合中的元素進行操做的時候,老是須要進行循環,循環,再循環。循環只 是作事的方式而不是目的,另外一方面,使用線性循環就意味着只能遍歷一次,若是但願再次
遍歷,只能在執行一次代碼。
Stream流的優雅寫法
//體驗Stream 流 public class Test1{ public static void main(String[] args) { ArrayList<String>list=new ArrayList<>(); list.add("李文傑"); list.add("李文集"); list.add("李文潔"); list.add("王智雅"); list.add("何舒雅"); list.add("王文文"); //使用Stream 流輸出 list.stream().filter(s->s.startsWith("李")). filter(s->s.length()==3).forEach(s->System.out.println(s)); //foreach 表明的就是for循環 } } 總結爲: 獲取流,過濾流,過濾流,開頭爲李,長度爲 3,逐一輸出,代碼中並無體現使用線性循環或其餘任何算法進行遍歷。 |
//Collection 集合獲取Stream流 public class Test2 { public static void main(String[] args) { //List集合獲取流 List<String>list=new ArrayList<>(); Stream<String>listStream=list.stream();
//Set集合獲取流 Set<String>set=new HashSet<>(); Stream<String>setStream=set.stream();
//數組獲取流Stream String[]array={"13","34","65","76","23"}; Stream<String>stream=Stream.of(array); } } |
//Map集合獲取流Stream流 public class Test2 { public static void main(String[] args) { //Map集合獲取流 Map<String,String>map=new HashMap<>(); //Map集合Stream流獲取鍵 Stream<String>mapStream=map.keySet().stream(); //Map集合Stream流獲取值 Stream<String>maps=map.values().stream(); //Map集合經過EntrySet來獲取Stream流,獲得鍵和值 Stream<Map.Entry<String,String>>entry=map.entrySet().stream(); } } |
外,其他方法都是延遲方法)
void forEach(Consumer<? super T> action) d |
該方法接收一個Consumer接口的函數,會將每個流元素交給函數進行處理
基本使用:
public class Test3 { public static void main(String[] args) { //foreach示例 Stream<String>stream=Stream.of("李文傑","張文集","王蘭君","李軍帽"); stream.forEach(s -> System.out.println(s)); } } |
過濾:能夠經過Filter方法將一個流轉換爲另外一個流
Stream<T> filter(Predicate<? super T> predicate) |
該方法接收一個 Predicate 函數式接口參數
基本使用:
public class Test3 { public static void main(String[] args) { //Fifter過濾器 Stream<String>stream=Stream.of("李文傑","張文集","王蘭君","李軍帽"); Stream<String>newstream=stream.filter(s ->s.startsWith("李")); newstream.forEach(s -> System.out.println(s)); } } |
1 若是須要將流中的元素映射到另外一個流中,可使用 map 方法.
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper) |
基本使用:
public class Test3 { public static void main(String[] args) { //map映射 Stream<String>stream1=Stream.of("12","34","45","66","99"); Stream<Integer>stream2=stream1.map(s ->Integer.parseInt(s)); stream2.forEach(s-> System.out.println(s+10)); } } |
流經過count方法來計算流中的個數
long count(); 返回此流中的元素數。 |
基本使用
//count方法的使用。 public class Test3 { public static void main(String[] args) { //count方法來統計流的個數 Stream<String>stream3=Stream.of("劉備","張飛","臥龍","鳳雛"); System.out.println("統計流的個數:"+stream3.count()); } } |
Limit 方法能夠對流進行截取,只取前n個。
Stream<T> limit(long maxSize) |
基本使用:
public class Test3 { public static void main(String[] args) { //limit方法使用,對流進行截取 Stream<String>stream4=Stream.of("趙雲","關羽","黃忠","馬超"); Stream<String>stream5=stream4.limit(3); stream5.forEach(s -> System.out.println(s)); } } |
Skip方法能夠對流實現跳過的操做,繼續執行如下的數據
Stream<T> skip (long n) ; 若是流的當前長度大於 n,則跳過前 n 個,不然將會獲得一個長度爲 0 的空流 |
基本使用:
public class Test3 { public static void main(String[] args) { //Skip方法實現對流元素的跳過 Stream<String>stream5=Stream.of("趙雲","關羽","黃忠","馬超"); Stream<String>stream6=stream5.skip(2); stream6.forEach(s -> System.out.println(s)); } } |
若是有兩個流,但願合併成爲一個流,那麼可使用 Stream 接口靜態方法 concat
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) |
基本使用:
public class Test3 { public static void main(String[] args) { //concat 若是兩個流,但願合併爲一個流,那麼就能夠進行組合 Stream<String>stream7=Stream.of("馬超"); Stream<String>stream8=Stream.of("西涼人"); Stream<String>stream9=Stream.concat(stream7,stream8); stream9.forEach(s -> System.out.println(s));} } |