Java——》Stream示例

版權聲明:本文爲博主原創文章,無需授權即可轉載,甚至無需保留以上版權聲明,轉載時請務必註明作者。
https://blog.csdn.net/weixin_43453386/article/details/106419374

一、簡介

操作 方法
拼接 joining()
集合 toList()
toSet()
toMap()
toCollection()
映射 mapping()
map()
分組 groupingBy()
partitioningBy()
計算 sum()
max()
min()
average()
reducing()
summingInt()
sum()
過濾 filter()
消費 peek()
排序 sorted()
匹配 anyMatch()
allMatch()
noneMatch()

二、示例


import lombok.Data;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamTest {
    //對象集合
     public static List<User> userList = Arrays.asList(
        new User(1, "張三", 12, "女"),
        new User(2, "李四", 21, "男"),
        new User(3, "王五", 32, "男"),
        new User(4, "王五", 32, "男"));
    //字符串集合
    public static List<String> strList = Arrays.asList("a1", "b1", "a2");
    //數字集合
    public static List<Integer> intList = Arrays.asList(1, 2, 3,3,4);

    public static void main(String[] args) {

        //拼接的字符
        String delimiter = " , ";
        String prefix = "Start--";
        String suffix = "--End";

        System.out.println("默認拼接:"+ strList.stream() .collect(Collectors.joining()));
        System.out.println("逗號拼接:"+String.join(delimiter, strList));
        System.out.println("逗號拼接:"+strList.stream() .collect(Collectors.joining(delimiter)));
        System.out.println("逗號拼接:"+userList.stream().map(e->e.getName()).collect(Collectors.joining(delimiter)));
        System.out.println("開頭、中間、結尾,都拼接:"+strList.stream() .collect(Collectors.joining(delimiter, prefix, suffix)));

        System.out.println("/******************************************************************************************************/");

        System.out.println("把所有的User的name,放入List<String>:"+userList.stream().map(User::getName).collect(Collectors.toList()));
        System.out.println("把所有的User的name,去重,放入List<String>:"+userList.stream().map(User::getName).distinct().collect(Collectors.toList()));

        System.out.println("/******************************************************************************************************/");

        //set自動去重,沒有順序
        System.out.println("把所有的User的name,放入Set<String>:"+ userList.stream().map(User::getName).collect(Collectors.toSet()));

        System.out.println("/******************************************************************************************************/");
        /**
         * 要求:key爲id,value爲User
         * 注意:toMap時,一定要注意key是否重複,當前key不重複
         * 結果:{1=User(id=1, name=張三, age=12, sex=女), 2=User(id=2, name=李四, age=21, sex=男), 3=User(id=3, name=王五, age=32, sex=男), 4=User(id=4, name=王五, age=32, sex=男)}
         * 異常:如果key重複,就會報錯java.lang.IllegalStateException: Duplicate key
         */
        System.out.println("key爲id,value爲User,當前key不重複:"+userList.stream().collect(Collectors.toMap(User::getId, Function.identity())));
        System.out.println("key爲id,value爲User,當前key不重複:"+userList.stream().collect(Collectors.toMap(User::getId, user->user)));

        System.out.println("key爲(id+sex),value爲name,當前key不重複:"+userList.stream().collect(Collectors.toMap(e->e.getId().toString().concat("-").concat(e.getSex()), e->e.getName())));
        System.out.println("key爲id,value爲(name+sex),當前key不重複:"+userList.stream().collect(Collectors.toMap(e->e.getId().toString(), e->e.getName().toString().concat("-").concat(e.getSex()))));

        System.out.println("key爲name,value爲User,當前key重複,value以第1個爲準:"+userList.stream().collect(Collectors.toMap(User::getName,Function.identity(),(t1, t2) -> t1)));
        System.out.println("key爲name,value爲User,當前key重複,value以第2個爲準:"+userList.stream().collect(Collectors.toMap(User::getName,Function.identity(),(t1, t2) -> t2)));

        System.out.println("/******************************************************************************************************/");

        System.out.println("用LinkedList收集:"+intList.stream().collect(Collectors.toCollection(LinkedList::new)).toString());
        System.out.println("用CopyOnWriteArrayList收集:"+intList.stream().collect(Collectors.toCollection(CopyOnWriteArrayList::new)).toString());
        System.out.println("用TreeSet收集:"+intList.stream().collect(Collectors.toCollection(TreeSet::new)).toString());

        System.out.println("/******************************************************************************************************/");

        /**
         * 要求:按name分組,key爲name,value爲List<User>
         * 結果:
         key:李四
         value:[User(id=2, name=李四, age=21, sex=男)]
         key:張三
         value:[User(id=1, name=張三, age=12, sex=女)]
         key:王五
         value:[User(id=3, name=王五, age=32, sex=男), User(id=4, name=王五, age=32, sex=男)]
         */
        Map<String, List<User>> map = userList.stream().collect(Collectors.groupingBy(User::getName));
        map.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));

        System.out.println("/******************************************************************************************************/");

        /**
         * 要求:按sex分組,key爲sex,value爲Set<String>
         * 結果:
         key:女
         value:[張三]
         key:男
         value:[李四, 王五]
         */
        Map<String, Set<String>> map1 = userList.stream().collect(Collectors.groupingBy(User::getSex,
            Collectors.collectingAndThen(
                Collectors.toMap(
                    e -> e,
                    e -> e.getName()
                ),
                e -> e.values()
                    .stream()
                    .collect(Collectors.toSet())
            )));
        map1.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));

        System.out.println("/******************************************************************************************************/");

        /**
         * 要求:按name分組,value.key爲id,value.value爲name
         * 注意:key是否重複,當前key不重複
         * 結果:
         key:李四
         value:{2=李四}
         key:張三
         value:{1=張三}
         key:王五
         value:{3=王五, 4=王五}
         */
        Map<String, Map<Integer, String>> map2 = userList.stream().collect(Collectors.groupingBy(User::getName,Collectors.toMap(User::getId, User::getName)));
        map2.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));

        System.out.println("/******************************************************************************************************/");

        /**
         * 要求:按name分組,value.key爲id,value.value爲(name+sex)
         * 注意:key是否重複,當前key不重複
         * 結果:
         key:李四
         value:{2=李四-男}
         key:張三
         value:{1=張三-女}
         key:王五
         value:{3=王五-男, 4=王五-男}
         */
        Map<String, Map<Integer, String>> map3 = userList.stream().collect(Collectors.groupingBy(User::getName,Collectors.toMap(User::getId, e->e.getName().concat("-").concat(e.getSex()))));
        map3.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));

        System.out.println("/******************************************************************************************************/");

        /**
         * 要求:按name分組,value.key爲id,value.value爲(name+sex)
         * 注意:key是否重複,當前key重複,以第1個爲準
         * 結果:
         key:李四
         value:{2=李四-男}
         key:張三
         value:{1=張三-女}
         key:王五
         value:{3=王五-男, 4=王五-男}
         */
        Map<String, Map<Integer, String>> map4 = userList.stream().collect(Collectors.groupingBy(User::getName,Collectors.toMap(User::getId, e->e.getName().concat("-").concat(e.getSex()),(e1,e2)->e1)));
        map4.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));

        System.out.println("/******************************************************************************************************/");

        /**
         * 要求:按sex分組,把同一組的name用逗號分割
         * 結果:
         key:女
         value:張三
         key:男
         value:王五,李四,王五
         */
        Map<String, String> map5 = userList.stream() .collect(
            Collectors.groupingBy(
                User::getSex,
                Collectors.collectingAndThen(
                    Collectors.toMap(
                        e -> e,
                        e -> e.getName()
                    ),
                    e -> e.values()
                        .stream()
                        .collect(Collectors.joining(","))
                )
            ));
        map5.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));

        System.out.println("/******************************************************************************************************/");

        /**
         * 要求:按奇偶數分組
         * 結果:
         key:false
         value:[1, 3, 3]
         key:true
         value:[2, 4]
         */
        Map<Boolean, List<Integer>> map6 = intList.stream().collect(Collectors.groupingBy(item -> item % 2 == 0));
        map6.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));

        System.out.println("/******************************************************************************************************/");

        System.out.println("最大值:"+intList.stream().collect(Collectors.collectingAndThen(Collectors.maxBy((a, b) -> a - b), Optional::get)).toString());

        System.out.println("/******************************************************************************************************/");

        System.out.println("最小值:"+ intList.stream().collect(Collectors.collectingAndThen(Collectors.minBy((a, b) -> a - b), Optional::get)).toString());

        System.out.println("/******************************************************************************************************/");

        System.out.println("平均值:"+ intList.stream().collect(Collectors.averagingDouble(item -> item)));

        System.out.println("/******************************************************************************************************/");

        System.out.println("求和一:"+userList.stream().collect(Collectors.summingInt(item -> item.getAge())));
        System.out.println("求和二:"+userList.stream().map(User::getAge).reduce(0,Integer::sum));
        System.out.println("求和三:"+userList.stream().mapToInt(User::getAge).sum());

        System.out.println("/******************************************************************************************************/");

        System.out.println("在每個name前面加上符號,再用逗號拼接:"+userList.stream().collect(Collectors.mapping(e -> "【".concat(e.getName()).concat("】"), Collectors.joining(","))));

        System.out.println("/******************************************************************************************************/");
        Map<String, IntSummaryStatistics> collect = userList.stream().collect(Collectors.groupingBy(User::getSex, Collectors.summarizingInt(User::getAge)));
        IntSummaryStatistics statistics1 = collect.get("男");
        IntSummaryStatistics statistics2 = collect.get("女");
        System.out.println("【統計】和:"+statistics1.getSum()+","+"平均值:"+statistics1.getAverage()+","+"最大值:"+statistics1.getMax()+","+"最小值:"+statistics1.getMin()+","+"平均值:"+statistics1.getAverage()+","+"計數:"+statistics1.getCount());
        System.out.println("【統計】和:"+statistics2.getSum()+","+"平均值:"+statistics2.getAverage()+","+"最大值:"+statistics2.getMax()+","+"最小值:"+statistics2.getMin()+","+"平均值:"+statistics2.getAverage()+","+"計數:"+statistics2.getCount());

        System.out.println("/******************************************************************************************************/");

        /**
         * intList:[1, 2, 3, 3, 4]
         * sum    :是每次累計計算的結果
         * b      :Function的結果,也就是 x+1 的結果
         * 結果   :18
         * 過程   :
         0+2
         2+3
         5+4
         9+4
         13+5
         */
        System.out.println("累計計算:"+intList.stream().collect(Collectors.reducing(0, x -> x + 1, (sum, b) -> {
            System.out.println(sum + "+" + b);
            return sum + b;
        })));

        // 下面代碼是對reducing函數功能實現的描述,用於理解reducing的功能
        int sum = 0;
        for (Integer item : intList) {
            int b = item + 1;
            System.out.println(sum + "+" + b);
            sum = sum + b;
        }
        System.out.println("累計計算:"+sum);

        System.out.println("/******************************************************************************************************/");

        System.out.println("過濾age>=21:"+userList.stream().filter(a -> a.getAge()>=21).map(e->e.getName()).collect(Collectors.toList()));
        System.out.println("過濾sex==男:"+userList.stream().filter(a -> "男".equals(a.getSex())).map(e->e.getName()).collect(Collectors.toList()));

        System.out.println("/******************************************************************************************************/");

        /**
         * 要求:每個User的age,都擴大10位
         * 結果:
         1,張三,old age:12
         1,張三,new age:120
         User(id=1, name=張三, age=120, sex=女)
         */
        userList.stream().peek(e->{
            System.out.println(e.getId() +","+e.getName()+","+"old age:"+e.getAge());
            e.setAge(e.getAge()*10);
            System.out.println(e.getId() +","+e.getName()+","+"new age:"+e.getAge());
        }).forEach(System.out::println);

        System.out.println("/******************************************************************************************************/");

        System.out.println("默認按照自然順序進行排序:"+intList.stream().sorted().collect(Collectors.toList()));
        System.out.println("按照降序順序進行排序:"+intList.stream().sorted((a,b)->b.compareTo(a)).collect(Collectors.toList()));

        System.out.println("/******************************************************************************************************/");

        System.out.println("集合中是否任一元素匹配以'a'開頭:"+strList.stream().anyMatch((s) -> s.startsWith("a")));
        System.out.println("集合中是否所有元素匹配以'a'開頭:"+strList.stream().allMatch((s) -> s.startsWith("a")));
        System.out.println("集合中是否沒有元素匹配以'd'開頭:"+strList.stream().noneMatch((s) -> s.startsWith("a")));
    }
}

@Data
class User{
    public Integer id;
    public String name;
    public Integer age;
    public String sex;

    public User(Integer id, String name, Integer age,String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章