- stream:
- 是數據渠道,用於操作數據源(數組,集合等.)所產生的元素序列
- 集合講的是數據,流講的是計算.
- 並行: parallel
- 注意:
- stram 自己不會存儲元素.
- stream 不會改變源對象,相反 他們會返回一個持有結果的新stream.
- stream 操作是延遲執行的,這意味着他們會等到需要結果的時候才執行.
- 使用步驟:
- 1.創建stream
- 2.中間操作
- 3.終止操作
- 注意:中間操作 不會執行任何操作,只有在終止操作的時候纔會一次性執行.
- 多箇中間操作可以連接起來形成一個流水線,除非流水線上出發終止操作,否則中間操作不會執行任何處理.而在終止操作時一次性全部處理.稱爲 "惰性求值".
-
public static void main(String[] args) { //可以通過Collection系列集合提供的stream() 串行 或 parallelStream() 並行 List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); //通過Arrays中的靜態方法stream()獲取 數組流 LoginRequest[] loginRequests = new LoginRequest[10]; Stream<LoginRequest> stream1 = Arrays.stream(loginRequests); //通過stream類中的靜態方法of() Stream<String> aa = Stream.of("aa"); //創建 無限流 //迭代 Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2); //iterate.limit(10) 就是中間操作 //forEach(System.out::println) 就是終止操作 iterate.limit(10).forEach(System.out::println); }
-
中間操作:
-
篩選與切片
-
filter 接收lambda, 從六中排除某些元素
-
limit 截斷流.使其元素不超過給定數量
-
skip(n) 跳過元素,返回一個扔掉了前n個元素的流,若流中元素不足n個,則返回一個空流,與limit互補
-
distinct 篩選(去重),通過流所生成元素的hashCode()和equals()去除重複元素
-
-
filter 篩選:
-
static List<LoginRequest> loginRequests = Arrays.asList( new LoginRequest("張三", "1111", "11"), new LoginRequest("李四", "2222", "22"), new LoginRequest("王五", "3333", "33"), new LoginRequest("趙六", "6666", "66") ); /** * @Description: filter 篩選 * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { Stream<LoginRequest> loginRequestStream = loginRequests.stream().filter((e) -> "22".equals(e.getAge())); loginRequestStream.forEach(System.out::println); }
-
-
limit截斷:
-
static List<LoginRequest> loginRequests = Arrays.asList( new LoginRequest("張三", "1111", "11"), new LoginRequest("李四", "2222", "22"), new LoginRequest("王五", "3333", "33"), new LoginRequest("趙六", "6666", "66") ); /** * @Description: limit截斷 * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { loginRequests.stream() .filter((e) -> Integer.valueOf(e.getAge()) > 11) .limit(2) .forEach(System.out::println); } 控制檯: LoginRequest{userName='李四', passWord='2222', age='22'} LoginRequest{userName='王五', passWord='3333', age='33'}
-
-
skip 跳過:
-
static List<LoginRequest> loginRequests = Arrays.asList( new LoginRequest("張三", "1111", "11"), new LoginRequest("李四", "2222", "22"), new LoginRequest("王五", "3333", "33"), new LoginRequest("趙六", "6666", "66") ); /** * @Description: skip 跳過 * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { loginRequests.stream() .filter((e) -> Integer.valueOf(e.getAge()) > 11) .skip(2) .forEach(System.out::println); } 控制檯: LoginRequest{userName='趙六', passWord='6666', age='66'}
-
-
distinct 去重
-
static List<LoginRequest> loginRequests = Arrays.asList( new LoginRequest("張三", "1111", "11"), new LoginRequest("張三", "1111", "11"), new LoginRequest("張三", "1111", "11"), new LoginRequest("李四", "2222", "22"), new LoginRequest("王五", "3333", "33"), new LoginRequest("趙六", "6666", "66") ); /** * @Description: distinct 去重 * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { loginRequests.stream() .filter((e) -> Integer.valueOf(e.getAge()) > 1) .distinct() .forEach(System.out::println); } 要重寫對象的equals和hashCode方法. 控制檯: LoginRequest{userName='張三', passWord='1111', age='11'} LoginRequest{userName='李四', passWord='2222', age='22'} LoginRequest{userName='王五', passWord='3333', age='33'} LoginRequest{userName='趙六', passWord='6666', age='66'}
-
-
-
映射:
-
map 接受lambda,講元素轉成其他形式或提取信息,接受一個函數作爲參數,該函數會被應用到每一個元素上,並將其映射成一個新的元素.
-
flagMap 接收一個函數作爲參數,將流中的每一個值都轉換成另一個流,然後把所有的流了解成一個流.
-
/** * @Description: 映射 map * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd"); list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println); } 控制檯: AAA BBB CCC DDD /** * @Description: 映射 flatMap * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println); System.out.println("----------------------------------"); //正常的map取值 Stream<Stream<Character>> streamStream = list.stream().map(Test::filter); //使用flatMap 都放到flagMap中 Stream<Character> characterStream = list.stream().flatMap(Test::filter); characterStream.forEach(System.out::println); } public static Stream<Character> filter(String string) { List<Character> list = new ArrayList(); for (Character character : string.toCharArray()) { list.add(character); } return list.stream(); } 總結:map相當於把一個個流加到map這個大流中. flatMap 相當於把流中的一個個元素加到flatMap流中
-
-
排序:
-
sorted() 自然排序
-
sorted(Comparator com) 定製排序
-
static List<LoginRequest> loginRequests = Arrays.asList( new LoginRequest("張三", "1111", "11"), new LoginRequest("張三1", "1113", "11"), new LoginRequest("張三2", "1112", "11"), new LoginRequest("李四", "2222", "22"), new LoginRequest("王五", "3333", "33"), new LoginRequest("趙六", "6666", "66") ); static List<String> list = Arrays.asList("aaa", "ccc", "ddd", "bbb"); /** * @Description: 排序 sorted * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { list.stream().sorted().forEach(System.out::println); //控制檯 aaa bbb ccc ddd loginRequests.stream().sorted((x, y) -> { //年齡相同 比密碼 if (x.getAge().equals(y.getAge())) { return x.getPassWord().compareTo(y.getPassWord()); } else { //直接比年齡 return Integer.valueOf(x.getAge()).compareTo(Integer.valueOf(y.getAge())); //倒敘 return -Integer.valueOf(x.getAge()).compareTo(Integer.valueOf(y.getAge())); } } ).forEach(System.out::println); } 控制檯: LoginRequest{userName='張三', passWord='1111', age='11'} LoginRequest{userName='張三2', passWord='1112', age='11'} LoginRequest{userName='張三1', passWord='1113', age='11'} LoginRequest{userName='李四', passWord='2222', age='22'} LoginRequest{userName='王五', passWord='3333', age='33'} LoginRequest{userName='趙六', passWord='6666', age='66'}
-
-
終止:
-
查找與匹配:
-
allMatch 檢查是否匹配所有元素
-
anyMatch 檢查是否至少匹配一個元素
-
noneMatch 檢查是否沒有匹配的所有元素
-
findFirst 返回第一個元素
-
finaAny 返回當前流中的任意元素
-
count 返回流中元素的總個數
-
max 返回流中最大值
-
min 返回流中最小值
-
-
static List<LoginRequest> loginRequests = Arrays.asList( new LoginRequest("張三", "1111", "11"), new LoginRequest("張三1", "1113", "11"), new LoginRequest("張三2", "1112", "11"), new LoginRequest("李四", "2222", "22"), new LoginRequest("王五", "3333", "33"), new LoginRequest("趙六", "6666", "66") ); /** * @Description: 查找匹配 * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { boolean b = loginRequests.stream().allMatch((x) -> x.getPassWord().equals("111111")); System.out.println(b); //其餘的匹配用法基本相同 //findFirst Optional<LoginRequest> optional = loginRequests.stream().sorted((x, y) -> x.getAge().compareTo(y.getAge())).findFirst(); //Optional是爲了放置空指針 如果爲空就用orElse()括號裏面的. LoginRequest loginRequest1 = new LoginRequest("111", "222", "333"); LoginRequest loginRequest = optional.orElse(loginRequest1); System.out.println(loginRequest.toString()); } 控制檯: false LoginRequest{userName='張三', passWord='1111', age='11'}
-
-
歸約 reduce(T identity,BinaryOperator ) / reduct(BinaryOperator) 可以將流中元素反覆結合起來,得到一個值.
-
/** * @Description: 歸約 reduce * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); Integer reduce = list.stream().reduce(0, (x, y) -> x + y); System.out.println(reduce); System.out.println("================================"); //有可能返回爲空的都是Optional ,因爲上面指定了起始值.不可能爲空. Optional<String> reduce1 = loginRequests.stream().map(LoginRequest::getUserName).reduce((x, y) -> x += (y)); System.out.println(reduce1); } 控制檯: 15 ================================ Optional[張三張三1張三2李四王五趙六]
-
-
收集: collect 將流轉換爲其他形式,接受一個collector接口的實現,用於給stream中元素做彙總的方法. (分組)
-
static List<LoginRequest> loginRequests = Arrays.asList( new LoginRequest("張三", "1111", "11"), new LoginRequest("張三1", "1113", "11"), new LoginRequest("張三2", "1112", "11"), new LoginRequest("李四", "2222", "22"), new LoginRequest("王五", "3333", "33"), new LoginRequest("趙六", "6666", "66") ); static List<String> list = Arrays.asList("aaa", "ccc", "ddd", "bbb"); /** * @Description: 收集 collect * @Param: [args] * @return: void * @Author: 單人影 * @Date: 2019/12/8 0008 15:59 */ public static void main(String[] args) { List<String> collect = loginRequests.stream().map(LoginRequest::getUserName).collect(Collectors.toList()); System.out.println(collect.toString()); Set<String> collects= loginRequests.stream().map(LoginRequest::getAge).collect(Collectors.toSet()); System.out.println(collects.toString()); //分組 groupingBy 還可以多級分組 Map<String, List<LoginRequest>> collect1 = loginRequests.stream().collect(Collectors.groupingBy(LoginRequest::getAge)); System.out.println(collect1.toString()); //還可以分區.true一個區 false一個區 Collectors.partitioningBy //連接 Collectors.join() 可以寫成join(",") 逗號拼接 } 控制檯: [張三, 張三1, 張三2, 李四, 王五, 趙六] [11, 22, 33, 66] {66=[LoginRequest{userName='趙六', passWord='6666', age='66'}], 33=[LoginRequest{userName='王五', passWord='3333', age='33'}], 22=[LoginRequest{userName='李四', passWord='2222', age='22'}], 11=[LoginRequest{userName='張三', passWord='1111', age='11'}, LoginRequest{userName='張三1', passWord='1113', age='11'}, LoginRequest{userName='張三2', passWord='1112', age='11'}]}
-
- 是數據渠道,用於操作數據源(數組,集合等.)所產生的元素序列
java 1.8 Stream
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.