Java8 Stream 統計 排序 List Map 相互轉換

package com.pigg.study.tree.common.stream;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

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

import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.*;

public class JavaStreamTest {

    private static List<Pig> pigs = new ArrayList<>();

    public static void main(String[] args) {

        pigs.add(new Pig(1, "豬爸爸", 31, "M", false));
        pigs.add(new Pig(2, "豬媽媽", 28, "F", true));
        pigs.add(new Pig(3, "喬治", 2, "M", false));
        pigs.add(new Pig(4, "佩奇", 5, "F", false));

        //region filter,過濾
        System.out.println("===a -> a.getAge() > 5===");
        pigs.stream().filter(a -> a.getAge() > 5).forEach(System.out::println);

        System.out.println("===Pig::isValid===");
        pigs.stream().filter(Pig::isValid).forEach(System.out::println);
        //endregion

        //region match,是否匹配,返回Boolean
        System.out.println("===anyMatch(a -> a.getAge() > 50)===");
        Boolean anyOldThan50 = pigs.stream().anyMatch(a -> a.getAge() > 50);
        System.out.println(anyOldThan50);

        System.out.println("===noneMatch(a -> a.getAge() > 50)===");
        Boolean noneMatchOldThan50 = pigs.stream().noneMatch(a -> a.getAge() > 50);
        System.out.println(noneMatchOldThan50);

        System.out.println("===allMatch(a -> a.getAge() < 50)===");
        Boolean allLittleThan50 = pigs.stream().allMatch(a -> a.getAge() < 50);
        System.out.println(allLittleThan50);
        //endregion

        //region find,查找數據,返回Optional<T>
        System.out.println("===pigs.stream().findFirst()===");
        Optional<Pig> pigOptional = pigs.stream().findFirst();
        if (pigOptional.isPresent()){
            System.out.println(pigOptional.get().getName());
        }

        System.out.println("===filter(a -> a.getAge() < 30).findFirst()===");
        Optional<Pig> pigOptional2 = pigs.stream().filter(a -> a.getAge() < 30).findFirst();
        if (pigOptional2.isPresent()){
            System.out.println(pigOptional2.get().getName());
        }
        //endregion

        //region sort排序
        System.out.println("comparing(Pig::getAge)");
        pigs.sort(comparing(Pig::getAge));
        pigs.forEach(System.out::println);

        System.out.println("comparing(Pig::getAge).reversed()");
        pigs.sort(comparing(Pig::getAge).reversed());
        pigs.forEach(System.out::println);

        System.out.println("根據性別gender升序排,再以年齡age升序");
        pigs.sort(comparing(Pig::getGender).thenComparing(Pig::getAge));
        pigs.forEach(System.out::println);

        System.out.println("根據性別gender升序排,再以年齡age降序");
        pigs.sort(comparing(Pig::getGender).thenComparing(comparing(Pig::getAge).reversed()));
        pigs.forEach(System.out::println);

        System.out.println("根據性別gender降序排,再以年齡age升序");
        pigs.sort(comparing(Pig::getGender).reversed().thenComparing(Pig::getAge));
        pigs.forEach(System.out::println);

        System.out.println("根據性別gender降序排,再以年齡age降序");
        pigs.sort(comparing(Pig::getGender).thenComparing(Pig::getAge).reversed());
        pigs.forEach(System.out::println);
        //endregion

        //region List<T>的map處理

        //獲取對象裏某個值的集合
        System.out.println("===map(Pig::getGender).collect(toList())===");
        List<String> genders = pigs.stream().map(Pig::getGender).collect(toList());
        genders.forEach(System.out::println);

        //配合distinct去重
        System.out.println("====map(Pig::getGender).distinct().collect(toList())===");
        List<String> disGenders = pigs.stream().map(Pig::getGender).distinct().collect(toList());
        disGenders.forEach(System.out::println);

        //配合toSet去重
        System.out.println("====map(Pig::getGender).distinct().collect(toSet())===");
        Set<String> disGenders2 = pigs.stream().map(Pig::getGender).collect(toSet());
        disGenders2.forEach(System.out::println);

        //joining拼接字符串
        System.out.println("===map(Pig::getName).collect(joining(\",\"))===");
        String names = pigs.stream().map(Pig::getName).collect(joining(","));
        System.out.println(names);

        //List轉Map<String, Object>
        System.out.println("===List轉Map<String, Object>, 如果key一樣,取第一個=== ");
        Map<String, Pig> mapByName = pigs.stream().collect(Collectors.toMap(Pig::getName, a->a, (k1, k2) -> k1));
        mapByName.forEach((k, v) -> {
            System.out.println(k + " -> " + v.toString());
        });

        //List<T>轉Map<String, List<T>>
        System.out.println("===List<T>轉Map<String, List<T>>===");
        Map<String, List<Pig>> groupByGender = pigs.stream().collect(groupingBy(Pig::getGender));
        groupByGender.forEach((k, v) -> {
            System.out.println(k + " -> " + v.toString());
        });

        System.out.println("===groupingBy + counting 統計各個性別的人數===");
        Map<String, Long> genderCount = pigs.stream().collect(
                Collectors.groupingBy(Pig::getGender, Collectors.counting())
        );
        genderCount.forEach((k, v) -> System.out.println(k + " -> 人數=" + v));

        //分區,partitioningBy,鍵是Boolean類型
        System.out.println("===.collect(partitioningBy(Pig::isValid))===");
        Map<Boolean, List<Pig>> partitioningByValid =pigs.stream().collect(partitioningBy(Pig::isValid));
        partitioningByValid.forEach((k, v) -> {
            System.out.println(k + " -> " + v.toString());
        });
        //endregion

        //region  List<Map<String, Object>>的map處理

        List<Map<String, Object>> pigMapList = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("id", "1");
        map1.put("name", "豬爸爸");
        map1.put("age" , 31);
        map1.put("gender" , "M");

        Map<String, Object> map2 = new HashMap<>();
        map2.put("id", "2");
        map2.put("name", "豬媽媽");
        map2.put("age" , 28);
        map2.put("gender" , "F");

        Map<String, Object> map3 = new HashMap<>();
        map3.put("id", "3");
        map3.put("name", "喬治");
        map3.put("age" , 2);
        map3.put("gender" , "M");

        pigMapList.add(map1);
        pigMapList.add(map2);
        pigMapList.add(map3);

        System.out.println("List<Map<String, Object>>的map處理--》獲取List<String>");
        List<String> pigIds = pigMapList.stream().map(a -> a.get("id").toString()).collect(Collectors.toList());
        pigIds.forEach(System.out::println);

        System.out.println("List<Map<String, Object>>的map處理--》獲取namesOfMap");
        String namesOfMap = pigMapList.stream().map(a -> a.get("name").toString()).collect(joining(","));
        System.out.println(namesOfMap);

        System.out.println("List<Map<String, Object>>的map處理--》根據Id分組,轉Map<String, List<Map<String, Object>>>");
        Map<String, List<Map<String, Object>>> groupByGenderMap = pigMapList.stream().collect(groupingBy(e -> e.get("gender").toString()));
        groupByGenderMap.forEach((k, v) -> {
            System.out.println(k + " -> " + v.toString());
        });
        //endregion

        //region 統計

        //count,統計個數
        long count = pigs.stream().filter(a -> a.getAge() > 5).count();
        System.out.println("age > 5的人數 = " + count);

        //limit,取前幾個
        System.out.println("top2");
        Stream<Pig> top2Pigs = pigs.stream().sorted(comparing(Pig::getAge)).limit(2);
        top2Pigs.forEach(System.out::println);

        int sumAge = pigs.stream().mapToInt(Pig::getAge).sum();
        int maxAge = pigs.stream().mapToInt(Pig::getAge).max().getAsInt();
        int minAge = pigs.stream().mapToInt(Pig::getAge).min().getAsInt();
        double avgAge = pigs.stream().mapToInt(Pig::getAge).average().getAsDouble();

        System.out.println("sumAge = " + sumAge);
        System.out.println("maxAge = " + maxAge);
        System.out.println("minAge = " + minAge);
        System.out.println("avgAge = " + avgAge);

        Optional<Pig> pigMaxAgeOptional = pigs.stream().collect(Collectors.maxBy(comparing(Pig::getAge)));
        if (pigMaxAgeOptional.isPresent()){
            System.out.println("maxAge = " + pigMaxAgeOptional.get().getAge());
        }
        //endregion
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Pig {
    private int id;
    private String name;
    private Integer age;
    private String gender;
    private boolean valid;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章