2019-05-16

List myList = Arrays.asList("a1", "a2", "a3", "b1", "b2", "c1", "c2");
myList.stream()
        .filter(s -> s.startsWith("c"))
        .map(String::toUpperCase)
        .sorted()
        .forEach(System.out::println);

Stream.of() 从一堆对象中创建 Stream 流。

Stream.of("a1", "a2", "a3", "b1", "b2", "c1", "c2")
        .findFirst()
        .ifPresent(System.out::println);

取代 for 循环

IntStream.range(1, 4)
        .forEach(System.out::println);

sum() / average()

Arrays.stream(new int[]{1, 2, 3})
        .map(n -> 2 * n + 1)
        .average()
        .ifPresent(System.out::println);

mapToInt() / mapToLong() / mapToDouble

Stream.of("a1", "a2", "a3")
        .map(s -> s.substring(1))
        .mapToInt(Integer::parseInt)
        .max()
        .ifPresent(System.out::println);

mapToObj()

IntStream.range(1, 4)
        .mapToObj(i -> "a" + i)
        .forEach(System.out::println);

组合示例

Stream.of(1.0, 2.0, 3.0)
        .mapToInt(Double::intValue)
        .mapToObj(i -> "a" + i)
        .forEach(System.out::println);

Stream 流的处理是随着链条垂直移动的。比如说,当 Stream 开始处理第一个元素时,它实际上会执行完filter 后,再执行 forEach,接着才会处理第二个元素。

Stream.of("d2", "a2", "b1", "b3", "c")
        .map(s -> {
            System.out.println("map: " + s);
            return s.toUpperCase();
        })
        .anyMatch(s -> {
            System.out.println("anyMatch: " + s);
            return s.startsWith("A");
        });

map: d2
anyMatch: D2
map: a2
anyMatch: A2

所以我们改变中间操作的顺序,将 filter 移动到链头的最开始,就可以大大减少实际的执行次数。这种小技巧对于流中存在大量元素来说,是非常有用的。

排序,sorted 是水平执行的。

Stream.of("d2", "a2", "b1", "b3", "c")
        .sorted(String::compareTo)
        .forEach(System.out::println);

复用流的方法

Supplier> streamSupplier = () -> Stream.of("d2", "a2", "b1", "b3", "c")
                .filter(s -> s.startsWith("a"));
        streamSupplier.get().anyMatch(s -> true);
        streamSupplier.get().noneMatch(s -> true);

.collect(Collectors.toList())
.collect(Collectors.toSet())
.collect(Collectors.groupingBy(p -> p.age))
.collect(Collectors.averagingInt(p -> p.age))
.collect(Collectors.summarizingInt(p -> p.age)) 全面的统计信息,摘要收集器计算出总数量,总和,最小值,平均值和最大值。

IntSummaryStatistics collect = persons.stream()
        .collect(Collectors.summarizingInt(Person::getAge));
System.out.println(collect);

IntSummaryStatistics{count=4, sum=76, min=12, average=19.000000, max=23}

你可能感兴趣的:(2019-05-16)