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
            }
    
        }
    }
  • 相关阅读:
    【面霸2】
    【面霸1】php知识点
    【技术宅11】php入门运算
    【技术宅10】顺序二分查找算法
    【技术宅9】遍历一个文件夹下的所有文件和子文件夹
    【技术宅7】一个或多个虚拟主机配置方法
    【技术宅6】把一个无限级分类循环成tree结构
    【技术宅5】抓去网页数据的3种方法
    【技术宅4】如何把M个苹果平均分给N个小朋友
    【技术宅3】截取文件和url扩展名的N种方法
  • 原文地址:https://www.cnblogs.com/yangshixiong/p/12182773.html
Copyright © 2011-2022 走看看