Java Stream流的使用
阿新 • • 發佈:2021-07-01
Java 8 新增的 Stream 是為了解放程式設計師操作集合(Collection)時的生產力,配合lambda使用效果翻倍,但是我不喜歡lambda,特別是看別人寫的lambda
@Test public void testStream() { String name[] = {"劉哈哈", "jk", "fd", "jk"}; List<String> strings = Arrays.asList(name); /** * distinct() 方法是一箇中間操作(去重),它會返回一個新的流(沒有共同元素) * count() 方法是一個終端操作,返回流中的元素個數。 */ int cout = (int) strings.stream().distinct().count(); System.out.println(cout); /** * 操作流:過濾 * 通過filter()方法從流中篩選出想要的元素 */ Stream<String> stream1 = strings.stream().filter(ss -> ss.contains("j")); stream1.forEach(System.out::println); /** * 操作流:對映 * 使用 map() 方法把一個流中的元素轉化成新的流中的元素 */ Stream<Integer> stream2 = strings.stream().map(String::length); stream2.forEach(System.out::println); /** * 操作流:匹配 * anyMatch(),只要有一個元素匹配傳入的條件,就返回 true。 * allMatch(),只有有一個元素不匹配傳入的條件,就返回 false;如果全部匹配,則返回true。 * noneMatch(),只要有一個元素匹配傳入的條件,就返回 false;如果全部不匹配,則返回 true。 */ boolean anyMatchFlag = strings.stream().anyMatch(ss -> ss.contains("劉")); boolean allMatchFlg = strings.stream().allMatch(ss -> ss.length()>1); boolean noneMatchFlg = strings.stream().noneMatch(ss -> ss.endsWith("p")); System.out.println(anyMatchFlag); System.out.println(allMatchFlg); System.out.println(noneMatchFlg); /** * 操作流:組合 * reduce() 方法的主要作用是把 Stream 中的元素組合起來,它有兩種用法: * Optional沒有起始值,只有一個引數,就是運算規則,此時返回 Optional。 * T reduce(T identity, BinaryOperator有起始值,有運算規則,兩個引數,此時返回的型別和起始值型別一致。 */ Integer ints[] = {1,2,3}; List<Integer> list = Arrays.asList(ints); // 沒有起始值,返回Optional型別 Optional<Integer> optional = list.stream().reduce((a,b) -> a+b); Optional<Integer> optional2 = list.stream().reduce(Integer::sum); System.out.println(optional); System.out.println(optional2); // 有起始值,返回引數型別 int reduce = list.stream().reduce(3,(a,b) -> a+b); int reduce2 = list.stream().reduce(3,Integer::sum); System.out.println(reduce); System.out.println(reduce2); /** * 操作流:轉換 * 將流轉換回集合、陣列、以及其他指定型別 */ List<String> listName = new ArrayList<>(); listName.add("張三"); listName.add("李四"); listName.add("王五"); // 流轉陣列 // String []::new 是一個可以產生所需陣列的函式 String[] strArray = listName.stream().toArray(String []::new); System.out.println(Arrays.toString(strArray)); // 流轉集合 List<Integer> streamToListIn = listName.stream().map(String::length).collect(Collectors.toList()); List<String> streamToListStr = listName.stream().collect(Collectors.toList()); System.out.println(streamToListIn); System.out.println(streamToListStr); // 流轉指定型別 // joining() 方法將元素收集到一個可以用分隔符指定的字串中 String str = listName.stream().collect(Collectors.joining(",")).toString(); System.out.println(str); }