JAVA8 流 Stream 的使用

JAVA8流的使用

一、筛选和切片

  1. 用谓词筛选 ==filter(T -> T.getXX())==
  2. 判断相同 ==distinct()==
  3. 截断流 ==limit(n)==
  4. 跳过元素 ==skip(n)==
  5. 排序 ==sorted(Comparator.comparing(T::getXX))==
  6. 遍历 ==forEach(XXX)==

二、映射

  1. 对流中每一个元素应用函数 ==map()==
    ==> 一般用于提取流中的内容 map(T :: getXX)
  2. 流的扁平化 ==flatMap()==
    ==> 将一个流中每个值都转换成另外一个流,然后再将转换的所有的流链接成一个流

三、查找与匹配

  1. 查找至少一个匹配 ==anyMatch()==
  2. 查找是全匹配 ==allMatch()==
    对应的无匹配是 ==noneMatch()==
  3. 查找任意元素 ==findAny()==
  4. 查找第一个元素 ==findFirst()==
  5. 查找最小/最大的
    ==min(Comparator.comparing(T::getXX))==
    ==max(Comparator.comparing(T::getXX))==

四、归约

  1. 求和 ==reduce(初始值,Integer :: sum)==
ins2.stream().reduce(0,Integer::sum)

不加初始值 返回Optional类型
  1. 求最大最小 ==reduce(初始值,Integer :: sum)==
ins.stream().reduce(0,Integer::max)
ins.stream().reduce(0,Integer::min)

不加初始值 返回Optional类型

五、数值流

五A、原始类型流特化
  1. 映射到数值流
    ==mapToInt(XX :: getX)==
    ==mapToDouble(XX :: getX)==
    ==mapToLong(XX :: getX)==

映射成功后 可以使用sum(),max(),min(),avg() 等方法

  1. 转换为对象流 (类似装箱)
    ==boxed()==

  2. 默认值
    ==OptionalInt==
    ==OptionalDouble==
    ==OptionalLong==

OptionalInt XX =trans.parallelStream().mapToInt(Transaction::getValue).max()
int max = XX.orElse(N)   拖过没有最大值,则为默认的N
五B、数值范围

IntStream和LongStream 有 方法

==range(m,n)==
==rangeClosed(m,n)==
对比是 后者包含n,前者不包含n

生成勾股数
Stream<double[]> sqrt = IntStream.rangeClosed(1, 100).boxed()
    .flatMap(a -> IntStream.rangeClosed(a, 100)
            .mapToObj(b -> new double[]{a,b,Math.sqrt(a*a + b*b)})
            .filter(t -> t[2] % 1 == 0));
sqrt.limit(10).forEach(t -> System.out.println((int)t[0] + "," + (int)t[1] + "," + (int)t[2]));

六、构建流

//1.由值创建流
Stream<String> s = Stream.of("1","2","3","6");
Stream<String> s2 = Stream.empty(); //创建空流
s.forEach(System.out::println);

//2.由数组创建流
int[] nums = { 11,60,61,12,16,20 };
int sum = Arrays.stream(nums).sum();

//3.由文件生成流
long lines = 0;
try (Stream<String> s3 = Files.lines(Paths.get("data.txt"),
        Charset.defaultCharset())) {
    lines = s3.flatMap(line -> Arrays.stream(line.split(""))).distinct().count();
} catch (Exception e) {
}
System.out.println(sum + "::" + lines);

//4.函数生成流
//4.1 迭代 iterate(n,lambda) 方法接受初始值,并将lambda作用于每个值
Stream.iterate(0, a -> a+2).limit(10).forEach(System.out::println);
//4.1.1 测试 斐波那契数列
Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0]+ t[1]})
        .limit(10).forEach(t -> System.out.print(t[0]+ " "));
Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0]+ t[1]})
.limit(10).map(t -> t[0] + " ").forEach(System.out::print);

//4.2 生成 generate 接受一个 Supplier<T> 类型 Lambda值
IntStream.generate(new IntSupplier() {
    public int getAsInt(){
        return 2;
    }
});
IntStream.generate(() -> 2).limit(10).forEach(System.out::print);;
//4.2.2 测试 斐波那契数列
IntStream.generate(new IntSupplier(){           
    private int a = 0;private int b = 1;
    public int getAsInt() {
        int oldPrevious = a;
        int nextValue = a + b;
        a = b;
        b = nextValue;
        return oldPrevious;}
    }).limit(10).forEach(System.out::println);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 5,017评论 1 2
  • 第一章 为什么要关心Java 8 使用Stream库来选择最佳低级执行机制可以避免使用Synchronized(同...
    谢随安阅读 5,360评论 0 4
  • 概要 流让你从外部迭代转向内部迭代。这样,你就用不着写下面这样的代码来显式地管理数据集合的迭代(外部迭代)了: 现...
    浔它芉咟渡阅读 5,415评论 1 2
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,353评论 0 33
  • 提示内用的框比较傻比较愣
    bingling823阅读 1,423评论 0 1