Java 提效神器 Stream 的冷门技巧

Stream使用这个方法创建一个 Stream 对象 。
new ArrayList<>().stream()Filter过滤器 , 里面传递一个函数 , 这个函数的返回结果如果为 true 则保留这个元素 , 否则的话丢弃这个元素 。
stringCollection.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);Foreach遍历 , 消费 。
stringCollection.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);Map这个功能也是遍历 , 但是他是有返回值的 , 而上面的 Foreach 是没有返回值的 , 仅仅是单纯的消费 。而且 Foreach 不能够链式调用 , 因为没有返回值 , 但是 Map 没问题 。
stringCollection.stream().map(String::toUpperCase).sorted(Comparator.reverseorder()).forEach(System.out::println);Sorted这个方法是用来排序的 , 里面传递的函数就是一个比较器 , 也可以不传递参数 , 使用默认的就好 。
stringCollection.stream().sorted(( x, y)-> y.length()-x.length()).filter((s) -> s.startsWith("a")).forEach(System.out::println);Match根据在给定的 stream 对象中是否含有指定内容返回 true 或者 false。
具体的有:

  • allMatch
  • anyMatch
  • noneMatch
boolean anyStartsWithA = stringCollection.stream().anyMatch((s) -> s.startsWith("a"));boolean allStartsWithA = stringCollection.stream().allMatch((s) -> s.startsWith("a"));boolean noneStartsWithZ = stringCollection.stream().noneMatch((s) -> s.startsWith("z"));count计算集合中的元素的个数 。
long startsWithB = stringCollection.stream().filter((s) -> s.startsWith("b")).count();reduce这个函数就是类似于斐波那契数列 , 每次传递的参数是上一次的结果和从集合中取出的新元素 。第一次默认取出了第一个元素和第二个元素 。
简单的例子就是 , 第一次取出 0,1 第二次取出 第一次reduce的结果作为第一个参数 , 取出 2 作为第二个参数 , 以此类推 。
Optional<String> reduced =stringCollection.stream().sorted().reduce((s1, s2) -> s1 + "#" + s2);parallelStream并行的 steam 流 , 可以进行并行处理 , 这样会效率更高 。在使用stream.foreach时这个遍历没有线程安全问题 , 但是使用parallelStream就会有线程安全问题 , 所有在parallelStream里面使用的外部变量 , 比如集合一定要使用线程安全集合 , 不然就会引发多线程安全问题 。如果说需要保证安全性需要使用 reduce 和 collect , 不过这个用起来超级麻烦!!!
long count = values.parallelStream().sorted().count();IntStream.range(a,b)可以直接生成 从 a 到 b 的整数这里还是遵循编程语言的大多数约定 , 那就是含头不含尾 。
IntStream.range(0, 10).forEach(System.out::println);输出的结果是
0123456789new Random().ints()获取一系列的随机值 , 这个接口出来的数据是连续不断的 , 所以需要用limit来限制一下 。
new Random().ints().limit(10).forEach(System.out::println);SupplierSupplier<String> stringSupplier=String::new;stringSupplier.get();该接口就一个抽象方法get方法,不用传入任何参数,直接返回一个泛型T的实例.就如同无参构造一样
Consumer1. accept方法该函数式接口的唯一的抽象方法,接收一个参数,没有返回值.
2. andThen方法? 在执行完调用者方法后再执行传入参数的方法.
public class ConsumerTest { public static void main(String[] args) { Consumer<Integer> consumer = (x) -> { int num = x * 2; System.out.println(num);}; Consumer<Integer> consumer1 = (x) -> { int num = x * 3; System.out.println(num);}; consumer.andThen(consumer1).accept(10);}先执行了 consumer.accept(10) 然后执行了 consumer1.accept(10)
ifPresent针对一个optional 如果有值的话就执行否则不执行 。
IntStream.builder().add(1).add(3).add(5).add(7).add(11).build().average().ifPresent(System.out::println);average 执行结果就是一个 optional
Collect他有两种调用方式
<R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner); <R, A> R collect(Collector<? super T, A, R> collector);下面主要介绍一下这两种方式的使用方法:


推荐阅读