1. 程式人生 > >Java 1.8 Stream 用例測試

Java 1.8 Stream 用例測試

foreach foreach遍歷 util 數組 list 重復 代碼 get fin

package stream;

import model.Student;
import org.junit.jupiter.api.Test;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 使用Stram流操作集合信息
 * @auther minghao
 * @date 2019.02.11
 */
public class studyStream {



    /**
     *
     */
    @Test
    public void test3() {
        //1.創建實體類準備數據
List<Student> students = new ArrayList<Student>() { { add(new Student(20160001, "孔明", 20, 1, "土木工程", "武漢大學")); add(new Student(20160002, "伯約", 21, 2, "信息安全", "武漢大學")); add(new Student(20162001, "仲謀", 19, 3, "土木工程", "浙江大學")); add(
new Student(20162001, "仲謀", 25, 3, "土木工程", "浙江大學")); add(new Student(20162001, "仲謀", 28, 3, "土木工程", "浙江大學")); add(new Student(20160003, "玄德", 22, 3, "經濟管理", "武漢大學")); add(new Student(20160004, "雲長", 21, 2, "信息安全", "武漢大學")); add(new Student(20161001, "翼德", 21, 2, "機械與自動化", "華中科技大學")); add(
new Student(20161002, "元直", 23, 4, "土木工程", "華中科技大學")); add(new Student(20161003, "奉孝", 23, 4, "計算機科學", "華中科技大學")); add(new Student(20162001, "仲謀", 22, 3, "土木工程", "浙江大學")); add(new Student(20162002, "魯肅", 23, 4, "計算機科學", "浙江大學")); add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大學")); } }; /** * 方式一:前面例子中使用的方式 * 獲取計算機科學專業學生的年齡總和 */ int totalAge = students.stream().filter(student -> "計算機科學".equals(student.getMajor())).mapToInt(Student::getAge).sum(); /** * 方式二:歸約操作 reduce * 獲取計算機科學專業學生的年齡總和 */ int totalAge2 = students.stream().filter(student -> "計算機科學".equals(student.getMajor())) .mapToInt(Student::getAge).reduce(0,(a,b) -> a+b); /** * 方式三:歸約操作(進一步簡化) reduce * 獲取計算機科學專業學生的年齡總和 */ int reduceAges = students.stream().filter(student -> "計算機科學".equals(student.getMajor())) .mapToInt(Student::getAge).reduce(0,Integer::sum); /** * 方式四:歸約操作(進一步簡化) reduce * 采用無初始值的重載版本,需要註意返回Optional * 獲取計算機科學專業學生的年齡總和 */ Optional optAges = students.stream().filter(student -> "計算機科學".equals(student.getMajor())) .map(Student::getAge).reduce(Integer::sum); /** * 求學生的總數 */ long count = students.stream().collect(Collectors.counting()); //進一步簡化 long count1 = students.stream().count(); /** * 求年齡的最大值和最小值 */ //求最大年齡 Optional<Student> collect = students.stream().collect(Collectors.maxBy((s1, s2) -> s1.getAge() - s2.getAge())); //進一步簡化 求最大年齡 Optional<Student> collect1 = students.stream().collect(Collectors.maxBy(Comparator.comparing(Student::getAge))); //求最小年齡 Optional<Student> collect2 = students.stream().collect(Collectors.minBy(Comparator.comparing(Student::getAge))); /** * 求年齡總和 */ Integer sunAges = students.stream().collect(Collectors.summingInt(Student::getAge)); /** * 求年齡的平均值 */ Double avgAge = students.stream().collect(Collectors.averagingInt(Student::getAge)); /** * 一次性得到元素(年齡)的個數、總和、均值、最大值、最小值 */ IntSummaryStatistics collect3 = students.stream().collect(Collectors.summarizingInt(Student::getAge)); /** * 字符串拼接,拼接所有對象的名字 */ String join = students.stream().map(Student::getName).collect(Collectors.joining()); String join2 = students.stream().map(Student::getName).collect(Collectors.joining(",")); /** * 按照學校進行分組(一級分組) */ Map<String, List<Student>> groupbySchool = students.stream().collect(Collectors.groupingBy(Student::getSchool)); /** * 按照學校進行分組,再按照專業分組(多級分組) */ Map<String,Map<String,List<Student>>> groupbySchoolAndMajor = students.stream().collect( Collectors.groupingBy(Student::getSchool, //一級分組 Collectors.groupingBy(Student::getMajor) //二級分組(二級套在一級裏面) )); /** * 傳遞一個Collector.counting,用以統計每個組的個數: * 統計根據學校分組,每組的數量 */ Map<String, Long> counting = students.stream().collect(Collectors.groupingBy(Student::getSchool, Collectors.counting())); /** * 使用分區Collectors.partitioningBy() * 將學生分為武大學生和非武大學生 */ Map<Boolean, List<Student>> isWhuSchool = students.stream().collect(Collectors.partitioningBy(student -> "武漢大學".equals(student.getSchool()))); System.out.println(); } /** * */ @Test public void test2(){ //1.創建實體類準備數據 List<Student> students = new ArrayList<Student>() { { add(new Student(20160001, "孔明", 20, 1, "土木工程", "武漢大學")); add(new Student(20160002, "伯約", 21, 2, "信息安全", "武漢大學")); add(new Student(20162001, "仲謀", 19, 3, "土木工程", "浙江大學")); add(new Student(20162001, "仲謀", 25, 3, "土木工程", "浙江大學")); add(new Student(20162001, "仲謀", 28, 3, "土木工程", "浙江大學")); add(new Student(20160003, "玄德", 22, 3, "經濟管理", "武漢大學")); add(new Student(20160004, "雲長", 21, 2, "信息安全", "武漢大學")); add(new Student(20161001, "翼德", 21, 2, "機械與自動化", "華中科技大學")); add(new Student(20161002, "元直", 23, 4, "土木工程", "華中科技大學")); add(new Student(20161003, "奉孝", 23, 4, "計算機科學", "華中科技大學")); add(new Student(20162001, "仲謀", 22, 3, "土木工程", "浙江大學")); add(new Student(20162002, "魯肅", 23, 4, "計算機科學", "浙江大學")); add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大學")); } }; /** * 2.使用stream流的filter過濾,通過lambda表達式從集合students中篩選出所有武漢大學的學生 * * stream():將students集合轉為stream流 * filter(): 中間操作 使用lambda表達式進行判斷,返回boolean類型 * collect(): 終端操作 * Conllect.toList(): 將結果封裝成為一個list集合 */ List<Student> whustudents = students.stream().filter(student -> "武漢大學".equals(student.getSchool())).collect(Collectors.toList()); /** * 3.使用stream流的filter + limit,通過lambda表達式從集合students中獲取2個專業為土木工程專業的學生 * * stream():將students集合轉為stream流 * filter(): 中間操作 使用lambda表達式進行判斷,返回boolean類型 * limit():限制返回的數量 * collect(): 終端操作 * Conllect.toList(): 將結果封裝成為一個list集合 * */ List<Student> limitStudents = students.stream().filter(a -> "土木工程".equals(a.getMajor())).limit(2).collect(Collectors.toList()); /** * 4.使用stream流的filter + limit + sorted, * 通過lambda表達式從集合students中獲取2個專業為土木工程專業的學生, * 並按年齡從小到大排序,篩選出年齡最小的兩個學生 * * stream():將students集合轉為stream流 * filter(): 中間操作 使用lambda表達式進行判斷,返回boolean類型 * limit():限制返回的數量 * sorted():對兩個值進行排序 * collect(): 終端操作 * Conllect.toList(): 將結果封裝成為一個list集合 * */ List<Student> sortedStudents = students.stream().filter(student -> "土木工程".equals(student.getMajor())) .sorted((s1,s2) -> s1.getAge() - s2.getAge()).limit(2).collect(Collectors.toList()); /** * 5.使用stream流 filter + skip 找出排序在2之後的土木工程專業的學生 * * stream():將students集合轉為stream流 * filter(): 中間操作 使用lambda表達式進行判斷,返回boolean類型 * skip():對篩選出來的結果,排除前面N個數量 * collect(): 終端操作 * Conllect.toList(): 將結果封裝成為一個list集合 */ List<Student> skipStudents = students.stream().filter(student -> "土木工程".equals(student.getMajor())) .skip(2).collect(Collectors.toList()); /** * 1.使用stream流 filter + map 通過map將學生實體映射成為學生姓名字符串 * 獲取專業為計算機科學的所有學生姓名 * * stream():將students集合轉為stream流 * filter(): 中間操作 使用lambda表達式進行判斷,返回boolean類型 * .map(Student :: getName):獲取當前實體類的姓名,返回給list集合 * collect(): 終端操作 * Conllect.toList(): 將結果封裝成為一個list集合 */ List<String> names = students.stream().filter(student -> "計算機科學".equals(student.getMajor())) .map(Student :: getName).collect(Collectors.toList()); /** * 2.使用stream流 filter + map 通過map將學生實體映射成為學生年齡 * 獲取專業為計算機科學的所有學生年齡 * * stream():將students集合轉為stream流 * filter(): 中間操作 使用lambda表達式進行判斷,返回boolean類型 * .map(Student :: getAge):獲取當前實體類的年齡,返回給list集合 * collect(): 終端操作 * Conllect.toList(): 將結果封裝成為一個list集合 */ List<Integer> ages = students.stream().filter(student -> "計算機科學".equals(student.getMajor())) .map(Student :: getAge).collect(Collectors.toList()); /** * 3.使用stream流 filter + maptoInt 通過map將學生實體映射成為學生年齡 的總和 * 獲取專業為計算機科學的所有學生年齡 的總和(年齡相加) * * stream():將students集合轉為stream流 * filter(): 中間操作 使用lambda表達式進行判斷,返回boolean類型 * .map(Student :: getAge):獲取當前實體類的年齡,返回給list集合 * sum(): 返回年齡的總和(年齡相加) */ int agesSum = students.stream().filter(student -> "計算機科學".equals(student.getMajor())) .mapToInt(Student :: getAge).sum(); String[] strs = {"java8", "is", "easy", "to", "use"}; /** * 將數組strs 中的每個元素使用split 拆分成為數組 * 返回list<String[]>的集合數組 * 註:distinct只有對於一個包含多個字符的流進行操作才能達到我們的目的 * 因此,下面兩行代碼效果一致 */ List<String[]> distinctStrs = Arrays.stream(strs).map(str -> str.split("")).distinct().collect(Collectors.toList()); List<String[]> Strs = Arrays.stream(strs).map(str -> str.split("")).collect(Collectors.toList()); /** * 將數組strs 中的每個元素使用split 拆分成為數組 * flatMap():將數組的多個元素轉換成為一個元素進行輸出 * * flatMap與map的區別在於 flatMap是將一個流中的每個值都轉成一個個流,然後再將這些流扁平化成為一個流 。 */ List<String> flatMapStrs = Arrays.stream(strs).map(str -> str.split("")) //得到List<String[]> .flatMap(Arrays::stream).collect(Collectors.toList()); //將List<String[]> 轉化為List<String> String a = flatMapStrs.toString(); /** * allMatch():判斷當前集合中所有人的年齡是否大於等於18歲 * true 全部大於/等於 * false 相反 */ boolean isAdult = students.stream().allMatch(student -> student.getAge() >= 18); /** * anyMatch():判斷當前集合中是否存在個別人的年齡是否大於等於18歲 * true 一個或多個存在 * false 一個也不存在 */ boolean hasWhu = students.stream().anyMatch(student -> student.getAge() >= 18); /** * noneMatch():判斷當前集合是否不存在filter指定的元素 * true 不存在 * false 存在 */ boolean noneCs = students.stream().noneMatch(student -> "計算機科學".equals(student.getMajor())); /** * findFirst():返回返回滿足條件的第一個元素 */ Optional<Student> optstu = students.stream().filter(student -> "土木工程".equals(student.getMajor())).findFirst(); /** * findAny():返回返回滿足條件的任意一個元素 */ Optional<Student> anyoptstu = students.stream().filter(student -> "土木工程".equals(student.getMajor())).findAny(); System.out.println(); } /** * 初步使用stream流完集合遍歷 */ @Test public void test(){ //1.準備數據 List<Integer> nums = new ArrayList<>(); for (int i = 1; i <= 20;i++){ nums.add(i); } for (int i = 10; i <= 20;i++){ nums.add(i); } //2.使用foreach篩選偶數 List<Integer> evens = new ArrayList<>(); for (Integer num: nums) { if (num % 2 == 0) evens.add(num); } /** * 3.1:使用stream流完成篩選偶數 返回list集合 filter() +collect() * * 一個流的處理分為三部分:轉換成流 ——> 中間操作(自定義) ——> 終端操作 * 例如: * stream():將集合轉換成流 * filter():指定我們自定義的篩選處理/自定義其他處理 * collect():對結果進行封裝處理 * Collectors.toList():指定其篩選流結果,封裝成一個List集合進行返回 */ List<Integer> StreamEvens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList()); System.out.println(); /** * 3.2:使用stream流完成篩選偶數,並去掉重復 返回list集合 filter() + distinct() + collect() * * stream():將集合轉換成流 * filter():指定我們自定義的篩選處理/自定義其他處理 * collect():對結果進行封裝處理 * distinct():去掉重復 * Collectors.toList():指定其篩選流結果,封裝成一個List集合進行返回 */ List<Integer> distinctEvens = nums.stream().filter(num -> num % 2 == 0).distinct().collect(Collectors.toList());

     
    /**
    * 使用stream流+foreach遍歷輸出 集合中的所有數據
    */
    nums.stream().forEach(num -> System.out.println(num));

System.out.println(); } }

Java 1.8 Stream 用例測試