java8 用法小结

一 简单的stream

parallelStream慎用,除非你知道它内部干了什么
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
        list.parallelStream().forEach(System.out::println);
        list.parallelStream().forEachOrdered(System.out::println);
6
5
7
8
3
1
4
2
---------
1
2
3
4
5
6
7
8
输出结果

二 简单的stream, collect, sum, count, groupBy, partition

假设有一个这样的对象流:

+----------+------------+-----------------+
| Name     | Age        | Address         |
+----------+------------+-----------------+
| aa       | 11         | shanghai        |
| bb       | 61         | beijing         |
| cc       | 30         | dalian          |
| dd       | 90         | dalian          |
+----------+------------+-----------------+

(1)初始化
        List<User> userList = Stream.of(
                new User("aa", 11, "shanghai"),
                new User("bb", 61, "beijing"),
                new User("cc", 30, "dalian"),
                new User("dd", 90, "dalian")
        ).collect(Collectors.toList());
(2)取某一字段 stream & collect
        System.out.println(userList.stream().map(User::getAddress).collect(Collectors.toList()));
        System.out.println("---------");
        ArrayList<String> arrayList = userList.stream().map(User::getAddress).collect(Collectors.toCollection(ArrayList::new));
        System.out.println(arrayList);
        System.out.println("---------");
        System.out.println(userList.stream().map(User::getAddress).collect(Collectors.joining("@@")));
[shanghai, beijing, dalian, dalian]
---------
[shanghai, beijing, dalian, dalian]
---------
shanghai@@beijing@@dalian@@dalian
输出结果
(3)取总和 sum
        System.out.println(userList.stream().mapToInt(User::getAge).sum());
192
输出结果
(3)分组
        Map<String, List<User>> addressMap = userList.stream().collect(Collectors.groupingBy(User::getAddress));
System.out.println(addressMap);
{shanghai=[User[name=aa,address=shanghai]], dalian=[User[name=cc,address=dalian], User[name=dd,address=dalian]], beijing=[User[name=bb,address=beijing]]}
输出结果
(4)分组取和,平均数
        Map<String, Long> addressCountMap = userList.stream().collect(Collectors.groupingBy(User::getAddress, Collectors.counting()));
        System.out.println(addressCountMap);

        Map<String, Double> map = userList.stream().collect(Collectors.groupingBy(User::getAddress, Collectors.averagingInt(User::getAge)));
        System.out.println(map);
{shanghai=1, dalian=2, beijing=1}
{shanghai=11.0, dalian=60.0, beijing=61.0}
输出结果
(5)分区 分区是一种特殊的分组,结果 map 至少包含两个不同的分组——一个true,一个false
        Map<Boolean, List<User>> partitionMap = userList.stream().collect(Collectors.partitioningBy(user -> Objects.equals(user.getAddress(), "beijing")));
        System.out.println(partitionMap);
        System.out.println(partitionMap.get(true));

        Map<Boolean, Map<String, Long>> partitionGroupByMap = userList.stream()
                .collect(Collectors.partitioningBy(user -> user.getAge() < 70, Collectors.groupingBy(User::getAddress, Collectors.counting())));
        System.out.println(partitionGroupByMap);
{false=[User[name=aa,address=shanghai], User[name=cc,address=dalian], User[name=dd,address=dalian]], true=[User[name=bb,address=beijing]]}
[User[name=bb,address=beijing]]
{false={dalian=1}, true={shanghai=1, dalian=1, beijing=1}}
输出结果



原文地址:https://www.cnblogs.com/balfish/p/7792477.html