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
        }

    }
}
posted @ 2020-01-12 15:24  灬灬灬灬灬灬  阅读(218)  评论(0编辑  收藏  举报