JDK1.8Streams API代碼實現

User實體類:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

@Data
@AllArgsConstructor
@ToString
public class User {
    private String name;
    private int age;
}

測試類:



@SpringBootTest
class DemoApplicationTests {

    List<User> list = Arrays.asList(
            // name,age
            new User("張三", 11),
            new User("王五", 20),
            new User("王五", 91),
            new User("張三", 8),
            new User("李四", 44),
            new User("李四", 44),
            new User("李四", 44)
    );
    @Test
    void contextLoads() {
    }

    /**
     * forEach遍歷
     */
    @Test
    public void testForEach(){
        // java 8 前
        System.out.println("java 8 前");
        for(User user: list){
            System.out.println(user);
        }
        // java 8 lambda
        System.out.println("java 8 lambda");
        list.forEach(user -> System.out.println(user));

        // java 8 stream lambda
        System.out.println("java 8 stream lambda");
        list.stream().forEach(user -> System.out.println(user));
    }

    /**
     * sorted對Stream中元素按指定規則進行排序
     */
    @Test
    public void testSort(){
        System.out.println("排序前");
        list.forEach(user -> System.out.println(user));
        System.out.println("排序後");
        System.out.println("java 8 前");
        Collections.sort(list, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.getAge()-o2.getAge();
            }
        });
        for (User user : list) {
            System.out.println(user);
        }
        System.out.println("java 8 stream 方法引用");
        list.stream().sorted(Comparator.comparing(User::getAge)).forEach(user -> System.out.println(user));//從小到大排序
        list.stream().sorted(Comparator.comparing(User::getAge).reversed()).forEach(user -> System.out.println(user));//從大到小排序
    }

    @Test
    public void testFilter(){
        System.out.println("過濾前");
        list.forEach(user -> System.out.println(user));
        System.out.println("過濾後");
        System.out.println("java前");
        for (User user : list) {
            if(user.getAge()>50){
                System.out.println(user);
            }
        }
        System.out.println("java 8 stream");
        list.stream().filter(user -> user.getAge()>50).forEach(user -> System.out.println(user));
    }

    /**
     * 從Stream中獲取指定數量的元素
     */
    @Test
    public void testLimit(){
        System.out.println("截斷前");
        list.forEach(user -> System.out.println(user));
        System.out.println("截斷後");
        System.out.println("java 8 前");
        for(int i=0;i<3;i++){
            System.out.println(list.get(i));
        }
        System.out.println("java 8 stream");
        list.stream().limit(3).forEach(user -> System.out.println(user));
    }

    /**
     * skip 跳過.
     */
    @Test
    public void testSkip() {
        // 跳過前三個元素,從第四個開始輸出
        System.out.println("-----跳過前-----");
        list.forEach(user -> System.out.println(user));
        System.out.println("-----跳過後-----");
        // java 8 前
        System.out.println("java 8 前");
        for (int i = 3; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        // java 8 stream
        System.out.println("java 8 stream");
        list.stream().skip(3).forEach(user -> System.out.println(user));
    }
    /**
     * distinct 去重.
     */
    @Test
    public void testDistinct() {
        // 因爲Arrays.asList() 返回的是Arrays的內部類ArrayList,操作remove,add會報錯
        List<User> users = new ArrayList(list);
        // 爲list去除重複數據
        System.out.println("-----去重前-----");
        list.forEach(user -> System.out.println(user));
        System.out.println("-----去重後-----");
        // java 8 前
        System.out.println("java 8 前");
        for (int i = 0; i < users.size() - 1; i++) {
            for (int j = users.size() - 1; j > i; j--) {
                if (users.get(j).getAge() == users.get(i).getAge() && users.get(j).getName()
                        .equals(users.get(i).getName())) {
                    users.remove(i);
                }
            }
        }
        for (User user : users) {
            System.out.println(user);
        }
        // java 8 stream
        System.out.println("java 8 stream");
        users.stream().distinct().forEach(user -> System.out.println(user));
    }

    /**
     * 去重+按照年齡大於40以後從小到大+只取前二
     */
    @Test
    public void demo(){
        list.stream().distinct().filter(user -> user.getAge()>40).limit(2).sorted(Comparator.comparing(User::getAge)).forEach(user -> System.out.println(user));
    }

    /**
     * 測試計算.
     */
    @Test
    public void testNum(){
        IntSummaryStatistics num = list.stream().mapToInt(user -> user.getAge())
                .summaryStatistics();
        System.out.println("總共人數:"+num.getCount());
        System.out.println("平均年齡:" + num.getAverage());
        System.out.println("最大年齡:" + num.getMax());
        System.out.println("最小年齡:" + num.getMin());
        System.out.println("年齡之和:" + num.getSum());
    }
    /**
     * map映射
     */
    @Test
    public void testMap(){
        //只要輸出所有人的年齡
        list.stream().forEach(user -> System.out.println(user));
        System.out.println("映射後");
        List<Integer> ages= list.stream().map(user -> user.getAge()).collect(toList());
        ages.forEach(age -> System.out.println(age));
        //小寫轉大寫
        List<String>words = Arrays.asList("aaa","vvvv","cccc");
        System.out.println("全部大寫----》");
        List<String>collect = words.stream().map(s ->s.toUpperCase()).collect(toList());
        collect.forEach(s -> System.out.println(s));
    }

    /**
     * flatMap
     */
    @Test
    public void testFlatMap(){
        //創建一個 裝有兩個泛型爲integer的集合

        Stream<List<Integer>> stream = Stream.of(Arrays.asList(1,2,3),Arrays.asList(4,5));
        //將兩個合成一個
        Stream<Integer> integerStream = stream.flatMap((Function<List<Integer>,Stream<Integer>>)
                integers ->integers.stream());
        //爲新的集合
        List<Integer> collect = integerStream.collect(toList());
        System.out.println("新stream大小:"+collect.size());
        System.out.println("-----合併後-----");
        collect.forEach(o -> System.out.println(o));
    }
    /**
     * findFirst
     */
    @Test
    public void testFindFist(){
        User user = list.stream().findFirst().get();
        System.out.println(user);
    }

    /**
     * reduce操作可以實現從一組元素中生成一個值
     */
    @Test
    public void reduce(){
        Optional<User>max = list.stream().reduce((s1,s2) ->s1.getAge() >s2.getAge() ?s1:s2);
        User user = max.get();
        System.out.println(user);
        // 求年齡之和
        Integer reduce = list.stream().reduce(0, // 該參數爲初始值
                (integer, user1) -> integer + user1.getAge(), // 該參數爲累加器,新元素如何累加
                (integer, integer2) -> integer + integer2);// 多個部分如何合併
        System.out.println(reduce);

    }
    /**
     * collect
     * 引用靜態方法	Integer::sum
     * 引用某個對象的方法	list::add
     * 引用某個類的方法	String::length
     * 引用構造方法	HashMap::new
     */
    @Test
    public void collect(){
        // 將Stream轉換成List或Set
        Stream<String> stream = Stream.of("I", "love", "you", "too");
        //List<String> list = stream.collect(Collectors.toList());
        //Set<String> set = stream.collect(Collectors.toSet());

        // 使用toCollection()指定規約容器的類型
        //ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));
        //HashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));

        // 使用Collectors.joining()拼接字符串
        //String joined = stream.collect(Collectors.joining());// "Iloveyoutoo"
        //String joined = stream.collect(Collectors.joining(","));// "I,love,you,too"
        String joined = stream.collect(Collectors.joining(",", "{", "}"));// "{I,love,you,too}"
        System.out.println(joined);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章