一 简单的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}}