1. 程式人生 > 實用技巧 >JAVA8——Stream()

JAVA8——Stream()

  Stream API常用方法:

    

Stream操作分類
中間操作 無狀態 unordered() filter() map() mapToInt() mapToLong() mapToDouble() flatMap() flatMapToInt() flatMapToLong() flatMapToDouble() peek()
有狀態 distinct() sorted() boxed() limit() skip()
結束操作 非短路操作 forEach() forEachOrdered() toArray() reduce() collect() max() min() count()
短路操作 anyMatch() allMatch() noneMatch() findFirst() findAny()

  

常用中介軟體

filter:過濾流,過濾流中的元素,返回一個符合條件的Stream

map:轉換流,將一種型別的流轉換為另外一種流。(mapToInt、mapToLong、mapToDouble返回int、long、double基本型別對應的Stream)

flatMap:簡單的說,就是一個或多個流合併成一個新流。(flatMapToInt、flatMapToLong、flatMapToDouble返回對應的IntStream、LongStream、DoubleStream流。)

distinct:返回去重的Stream。

sorted:返回一個排序的Stream。

peek:主要用來檢視流中元素的資料狀態。

limit:返回前n個元素資料組成的Stream。屬於短路操作

skip:返回第n個元素後面資料組成的Stream。

  boxed: 將LongStream、IntStream、DoubleStream轉換成對應型別的Stream<T>

結束操作

forEach:迴圈操作Stream中資料。

toArray:返回流中元素對應的陣列物件。

reduce:聚合操作,用來做統計。

collect:聚合操作,封裝目標資料。

min、max、count:聚合操作,最小值,最大值,總數量。

anyMatch: 短路操作,有一個符合條件返回true。

allMatch:所有資料都符合條件返回true。

noneMatch:所有資料都不符合條件返回true。

findFirst:短路操作,獲取第一個元素。

findAny:短路操作,獲取任一元素。

forEachOrdered: 暗元素順序執行迴圈操作。

舉例說明

@Data
public class Person {
    
    private Integer  id;
    
    private String name;
    
    private String sex;
    
    private Integer age;
    
}

map中介軟體例子

public class TestMap {

    public static void main(String[] args) {
        List<Person> persionList = new ArrayList<Person>();
        persionList.add(new Person(1,"小陳","男",38));
        persionList.add(new Person(2,"小小","女",2));
        persionList.add(new Person(3,"小李","男",65));
        persionList.add(new Person(4,"小王","女",20));
        persionList.add(new Person(5,"小童","男",38));
        persionList.add(new Person(6,"小劉","男",65));

        //1、只取出該集合中所有姓名組成一個新集合
        List<String> nameList=persionList.stream().map(Person::getName).collect(Collectors.toList());
        System.out.println(nameList.toString());

        //2、只取出該集合中所有id組成一個新集合
        List<Integer> idList=persionList.stream().mapToInt(Person::getId).boxed().collect(Collectors.toList());
        System.out.println(idList.toString());

        //3、list轉map,key值為id,value為Person物件
        Map<Integer, Person> personmap = persionList.stream().collect(Collectors.toMap(Person::getId, person -> person));
        System.out.println(personmap.toString());

        //4、list轉map,key值為id,value為name
        Map<Integer, String> namemap = persionList.stream().collect(Collectors.toMap(Person::getId, Person::getName));
        System.out.println(namemap.toString());

        //5、進行map集合存放,key為age值 value為Person物件 它會把相同age的物件放到一個集合中
        Map<Integer, List<Person>> ageMap = persionList.stream().collect(Collectors.groupingBy(Person::getAge));
        System.out.println(ageMap.toString());

        //6、獲取最小年齡
        Integer ageMin = persionList.stream().mapToInt(Person::getAge).min().getAsInt();
        System.out.println("最小年齡為: "+ageMin);

        //7、獲取最大年齡
        Integer ageMax = persionList.stream().mapToInt(Person::getAge).max().getAsInt();
        System.out.println("最大年齡為: "+ageMax);

        //8、集合年齡屬性求和
        Integer ageAmount = persionList.stream().mapToInt(Person::getAge).sum();
        System.out.println("年齡總和為: "+ageAmount);
        
    }
}

filter相關

public class TestFilter {

    public static void main(String[] args) {
        List<Person> persionList = new ArrayList<Person>();
        persionList.add(new Person(1, "張三", "男", 8));
        persionList.add(new Person(2, "小小", "女", 2));
        persionList.add(new Person(3, "李四", "男", 25));
        persionList.add(new Person(4, "王五", "女", 8));
        persionList.add(new Person(5, "趙六", "女", 25));
        persionList.add(new Person(6, "大大", "男", 65));

        //1、查詢年齡大於20歲的人數
        long  age=persionList.stream().filter(p->p.getAge()>20).count();
        System.out.println(age);

        //2、查詢年齡大於20歲,性別為男的人數
       List<Person>  ageList=persionList.stream().filter(p->p.getAge()>20).filter(p->"男".equals(p.getSex())).collect(Collectors.toList());
        System.out.println(ageList.size());

    }

sorted相關

//陣列相關
public
class TestSort { String[] arr1 = {"abc","a","bc","abcd"}; /** * 按照字元長度排序 */ @Test public void testSorted1_(){ Arrays.stream(arr1).sorted(Comparator.comparing(String::length)).forEach(System.out::println); //輸出:a、bc、abc、abcd } /** * 倒序 * reversed(),java8泛型推導的問題,所以如果comparing裡面是非方法引用的lambda表示式就沒辦法直接使用reversed() * Comparator.reverseOrder():也是用於翻轉順序,用於比較物件(Stream裡面的型別必須是可比較的) * Comparator. naturalOrder():返回一個自然排序比較器,用於比較物件(Stream裡面的型別必須是可比較的) */ @Test public void testSorted2_(){ Arrays.stream(arr1).sorted(Comparator.comparing(String::length).reversed()).forEach(System.out::println); //輸出:abcd、abc、bc、a Arrays.stream(arr1).sorted(Comparator.reverseOrder()).forEach(System.out::println); //輸出:bc、abcd、abc、a Arrays.stream(arr1).sorted(Comparator.naturalOrder()).forEach(System.out::println); //輸出:a、abc、abcd、bc } /** * 先按照首字母排序 * 之後按照String的長度排序 */ @Test public void testSorted3_(){ Arrays.stream(arr1).sorted(Comparator.comparing(this::com1).thenComparing(String::length)).forEach(System.out::println); } //輸出:a、abc、abcd、bc public char com1(String x){ return x.charAt(0); } }
//集合相關
public
class TestSort { public static void main(String[] args) { List<Person> persionList = new ArrayList<Person>(); persionList.add(new Person(1, "張三", "男", 8)); persionList.add(new Person(2, "小小", "女", 2)); persionList.add(new Person(3, "李四", "男", 25)); persionList.add(new Person(4, "王五", "女", 8)); persionList.add(new Person(5, "趙六", "女", 25)); persionList.add(new Person(6, "大大", "男", 65)); //1、找到年齡最小的歲數 Collections.sort(persionList, (x, y) -> x.getAge().compareTo(y.getAge())); Integer age = persionList.get(0).getAge(); System.out.println("年齡最小的有:" + age); //輸出:年齡最小的有:2 //2、找到年齡最小的姓名 String name = persionList.stream() .sorted(Comparator.comparingInt(x -> x.getAge())) .findFirst() .get().getName(); System.out.println("年齡最小的姓名:" + name); //輸出:年齡最小的姓名:小小 } }