zoukankan      html  css  js  c++  java
  • java入门篇18 --- lambda与stream

    lambda相信我们在各种程序都遇见过,就是一个匿名函数,stream从名字上看,这就是一个流,就跟python中yeild实现迭代器的原理一样,可以表示无限大的数据,但只占一点内存,在进行调用的时候可以实时计算出来,并返回。

    那么接下来我们来看一下lambda用法,这个其实之前在集合以及多线程中已经使用过了,现在再来回顾一下

    import java.util.Arrays;
    
    public class HelloWorld {
        public static void main(String[] args) throws Exception {
            String[] l = new String[]{"b", "a", "c", "p", "e"};
            // 这个就是使用默认的排序
            Arrays.sort(l);
            System.out.println(String.join(", ", l));  // a, b, c, e, p
    
            // 这个就是使用我们自定义的方法,这个就是匿名函数 ()->{},如果函数体只有一行,可以省略花括号以及return
            Arrays.sort(l, (String s1, String s2) -> {
                System.out.println("compare");
                return -s1.compareTo(s2);
            });
            Arrays.sort(l, (String s1, String s2) -> -s1.compareTo(s2));
            System.out.println(String.join(", ", l));  // p, e, c, b, a
    
            // 方法引用,如果参数相同,返回值也一样,那么就可以简单的使用这种方法引用
            Arrays.sort(l, HelloWorld::compare);
            System.out.println(String.join(", ", l));  // a, b, c, e, p
        }
    
        static int compare(String s1, String s2) {
            return s1.compareTo(s2);
        }
    }

    接下来我们看一下stream,假如现在有一个需求,让你建立一个全体自然数的列表,如果我们直接使用列表去接受,那肯定不现实,下面我们来看一下Stream的使用

    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.function.Supplier;
    import java.util.stream.Stream;
    
    class NatureNum implements Supplier<Integer> {
        int n = 0;
    
        @Override
        public Integer get() {
            n++;
            return n;
        }
    }
    
    public class HelloWorld {
        public static void main(String[] args) throws Exception {
            // 可以使用Stream.of创建对象
            Stream<String> s = Stream.of("a", "b", "c");
            s.forEach(System.out::println);  // a b c
    
            // 可以使用Stream.generate(参数实现了supplier接口)生成数据流
            Stream<Integer> l = Stream.generate(new NatureNum());
            // filter过滤, map 执行一个方法的池子 limit 打印多少个  forEach循环
            l.filter(n -> n % 2 == 0).map(n -> n * 2).limit(10).forEach(System.out::println);  // 4 8 12 16 20 24 28 32 36 40
            // 文件也可以使用liu使用Files.lines可以生成流
            try (Stream<String> f = Files.lines(Paths.get("./src/t.txt"))) {
                f.forEach(System.out::println);  // hello
            }
    
        }
    }
  • 相关阅读:
    BlogEngine.Net
    加速Web开发的9款知名HTML5框架
    个人论坛博客的代码
    Android客户端调用Asp.net的WebService
    前端总结数据结构与算法基础
    node知识点及第三方模块
    消息轮播
    el-date-picker 组件时间格式化方式
    Vue+Element前端导入导出Excel
    vue单元测试
  • 原文地址:https://www.cnblogs.com/yangshixiong/p/12182773.html
Copyright © 2011-2022 走看看